JsonMappingException。没有为类型[简单类型,类]找到合适的构造函数:不能从JSON对象实例化

当我试图获取一个JSON请求并处理它时,我得到了以下错误。

org.codehaus.jackson.map.JsonMappingException。没有为类型[simple type, class com.myweb.ApplesDO]找到合适的构造函数:不能从JSON对象实例化(需要添加/启用类型信息?)

以下是我试图发送的JSON。

{
  "applesDO" : [
    {
      "apple" : "Green Apple"
    },
    {
      "apple" : "Red Apple"
    }
  ]
}

在控制器中,我有以下方法签名。

@RequestMapping("showApples.do")
public String getApples(@RequestBody final AllApplesDO applesRequest){
    // Method Code
}

AllApplesDO是ApplesDO的一个封装器。

public class AllApplesDO {

    private List<ApplesDO> applesDO;

    public List<ApplesDO> getApplesDO() {
        return applesDO;
    }

    public void setApplesDO(List<ApplesDO> applesDO) {
        this.applesDO = applesDO;
    }
}

ApplesDO。

public class ApplesDO {

    private String apple;

    public String getApple() {
        return apple;
    }

    public void setApple(String appl) {
        this.apple = apple;
    }

    public ApplesDO(CustomType custom){
        //constructor Code
    }
}

我认为Jackson无法将JSON转换为子类的Java对象。请帮助提供Jackson的配置参数,以便将JSON转换为Java对象。我正在使用Spring框架。

EDIT: 包括了在上述样本类中导致这个问题的主要错误--请看接受的答案,以获得解决方案。

解决办法

因此,我终于意识到问题所在。这不是我所怀疑的杰克逊配置问题。

事实上,问题出在ApplesDO类。

public class ApplesDO {

    private String apple;

    public String getApple() {
        return apple;
    }

    public void setApple(String apple) {
        this.apple = apple;
    }

    public ApplesDO(CustomType custom) {
        //constructor Code
    }
}

该类有一个自定义的构造函数,使其成为默认构造函数。引入一个假的构造函数后,错误就消失了。

public class ApplesDO {

    private String apple;

    public String getApple() {
        return apple;
    }

    public void setApple(String apple) {
        this.apple = apple;
    }

    public ApplesDO(CustomType custom) {
        //constructor Code
    }

    //Introducing the dummy constructor
    public ApplesDO() {
    }

}
评论(13)

发生这种情况的原因有这些。

1.你的内层类应该被定义为静态

    私人静态类Condition { //jackson specific
    }

2.可能是你的类中没有默认的构造函数(更新:似乎不是这种情况)。

    私有静态类Condition {
        Private Long id;

        public Condition() {
        }

        // 设置器和获取器
    }

3.可能是你的setter定义不正确,或者不可见(例如,私有setter)。

评论(14)

能否请你测试一下这个结构。如果我没记错的话,你可以这样使用它。

{
    "applesRequest": {
        "applesDO": [
            {
                "apple": "Green Apple"
            },
            {
                "apple": "Red Apple"
            }
        ]
    }
}

第二,请为每个类添加默认的构造函数,这也可能有帮助。

评论(4)