【问题标题】:Java Springboot consume rest api map to a model [duplicate]Java Spring Boot将rest api映射到模型[重复]
【发布时间】:2019-01-22 22:26:32
【问题描述】:

我正在尝试将 API 的响应映射到我的对象:

class Person {
  private Long id;
  private String firstname;
  private String lastname;

  public Person(Long id, String firstname, String lastname)
...

我的 api 调用看起来像:

RestTemplate restTemplate = new RestTemplate();
Person person = restTemplate.getForObject("http://xxx/getPerson", Person.class);

返回的 json 格式如下:

{
 "id": 1,
 "firstname": "first",
 "lastname": "last"
}

不幸的是,我收到以下错误:

Type definition error: [simple type, class xxx.Person]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `xxx.Person` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)\n at [Source: (PushbackInputStream); line: 4, column: 5]

知道为什么吗? 我的班级中有一个构造函数,所以我不太确定为什么会引发错误。谢谢!

【问题讨论】:

  • 在你的 pojo 类中创建默认构造函数
  • 既然你有 args 构造函数,你有责任不创建 arg 构造函数

标签: java rest spring-boot resttemplate


【解决方案1】:

Person 类中没有默认构造函数,您可以手动创建它,也可以在类顶部使用 lombok @NoargConstructor 来创建它

由于您声明了参数构造函数,因此您有责任不创建任何参数构造函数

【讨论】:

    【解决方案2】:

    您需要先创建一个默认构造函数。此外,您可以使用@JsonIgnoreProperties(ignoreUnknown = true) 注解忽略模型中定义的属性以外的任何其他属性。

    看看这个例子 - https://spring.io/guides/gs/consuming-rest/

    【讨论】:

      【解决方案3】:

      正如例外明确指出的那样:

      (不存在创建者,如默认构造)

      您的类Person 没有默认构造函数

      知道为什么吗?

      因为您显式定义了一个构造函数,并且由于这种行为,默认构造函数不会自动生成。

      所以你应该处理它,有两件事你需要关心:

      1. 提供default constructor 要么您明确定义它,要么使用lombok 注释@NoArgsConstructor;
      2. 另一个提示可能是属性不匹配问题,如果 json 没有您的 class 定义的所有属性,您还应该通过 @JsonIgnoreProperties(ignoreUnknown = true) 显式忽略它们到类或为额外字段分别添加 @JsonIgnore .

      【讨论】:

      • 太好了,太愚蠢了!我只需要一个空的构造函数。谢谢各位!
      • 只是好奇......如果他有一个空的构造函数并且没有设置器,杰克逊如何真正设置这些字段值?他们不都是私人的吗?
      • 杰克逊似乎在使用反射
      • @Nibras 我认为这是一种设计平衡:因为您明确地创建了自己的。当您将其留空时,JVM 会有所帮助 - 也许是糖?
      猜你喜欢
      • 2019-08-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-30
      • 1970-01-01
      • 2016-07-18
      • 2023-03-18
      • 2019-07-08
      • 2021-11-27
      相关资源
      最近更新 更多