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

2022-08-31 04:27:58

我在尝试获取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;
    }
}

苹果DO:

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框架。

编辑:在上面的示例类中包含导致此问题的主要错误 - 请查看可接受的答案以获取解决方案。


答案 1

所以,我终于意识到问题出在哪里。这不是我所怀疑的杰克逊配置问题。

实际上,问题出在 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() {
    }

}

答案 2

发生这种情况的原因如下:

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

    private static class Condition {  //jackson specific    
    }
    
  2. 可能是您的类中没有默认构造函数(更新:情况似乎并非如此)

    private static class Condition {
        private Long id;
    
        public Condition() {
        }
    
        // Setters and Getters
    }
    
  3. 可能是您的 Setter 未正确定义或不可见(例如,私人 Setter)