Java Spring Boot将rest api映射到模型[重复]

Posted

技术标签:

【中文标题】Java Spring Boot将rest api映射到模型[重复]【英文标题】:Java Springboot consume rest api map to a model [duplicate] 【发布时间】: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 构造函数 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

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

知道为什么吗?

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

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

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

【讨论】:

太好了,太愚蠢了!我只需要一个空的构造函数。谢谢各位! 只是好奇......如果他有一个空的构造函数并且没有设置器,杰克逊如何真正设置这些字段值?他们不都是私人的吗? 杰克逊似乎在使用反射 @Nibras 我认为这是一种设计平衡:因为您明确地创建了自己的。当您将其留空时,JVM 会有所帮助 - 也许是糖?

以上是关于Java Spring Boot将rest api映射到模型[重复]的主要内容,如果未能解决你的问题,请参考以下文章

集成 Angular + Nodejs + Spring Boot Java REST API 使 Angular Universal 工作

java 使用Rest Assured和Spring Boot来休息Api文档

未找到接口 java.util.List Rest API Spring boot 的主构造函数或默认构造函数

NGINX 反向代理背后的 Spring Boot API REST

仅在 REST API 调用上的 Spring Boot 404

Spring Boot构建RESTful API与单元测试