Java Springboot使用剩余api映射到模型

时间:2018-08-16 02:47:29

标签: java rest spring-boot resttemplate

我正在尝试将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]

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

3 个答案:

答案 0 :(得分:2)

作为例外明确指出:

  

(不存在像默认构造一样的创建者)

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

  

知道为什么吗?

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

所以您应该处理它,并且需要注意两件事:

  1. 提供一个default constructor,您可以明确定义它,也可以使用 lombok 注释@NoArgsConstructor;
  2. 另一个提示可能是属性不匹配的问题,如果json没有您的class定义的所有属性,您还应该通过@JsonIgnoreProperties(ignoreUnknown = true)显式地忽略它们,或者添加{{1} }分别用于其他字段。

答案 1 :(得分:1)

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

自从声明了参数构造函数以来,您有责任不创建arg构造函数

答案 2 :(得分:1)

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

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