首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JsonMappingException:找不到适用于类型[简单类型,类]的构造函数:无法从JSON对象实例化

JsonMappingException:找不到适用于类型[简单类型,类]的构造函数:无法从JSON对象实例化
EN

Stack Overflow用户
提问于 2011-10-02 18:16:13
回答 14查看 452.3K关注 0票数 457

在尝试获取JSON请求并对其进行处理时,我遇到以下错误:

JSON org.codehaus.jackson.map.JsonMappingException:找不到适用于类型简单类型的构造函数,类com.myweb.ApplesDO:无法从

对象实例化(需要添加/启用类型信息?)

这是我尝试发送的JSON:

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

在Controller中,我有以下方法签名:

@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 Framework。

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

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2011-10-02 22:15:36

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

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

}
票数 587
EN

Stack Overflow用户

发布于 2014-09-14 17:20:14

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

  1. 您的内部类应该定义为static

私有静态类条件{//特定于杰克逊的}

  • 可能是因为你的类中没有默认的构造函数(更新:看起来不是这样)

私有静态类条件{私有长id;公共条件(){} // setter和Getters }

  • 可能是您的setter未正确定义或不可见(例如私有setter)
票数 387
EN

Stack Overflow用户

发布于 2014-11-26 20:15:15

我想为此添加另一个不需要伪构造函数的解决方案。因为伪构造函数有点凌乱,随后会让人感到困惑。我们可以提供一个安全的构造函数,通过注释构造函数的参数,我们允许jackson确定构造函数参数和字段之间的映射。

所以下面的方法也是可行的。注意:注释中的字符串必须与字段名匹配。

import com.fasterxml.jackson.annotation.JsonProperty;
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 ApplesDO(@JsonProperty("apple")String apple) {
        }

}
票数 58
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7625783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档