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