【发布时间】:2018-06-28 01:48:54
【问题描述】:
我有以下 DTO:
@Value
public class PracticeResults {
@NotNull
Map<Long, Boolean> wordAnswers;
}
@Value
public class ProfileMetaDto {
@NotEmpty
String name;
@Email
String email;
@Size(min = 5)
String password;
}
@Value 是一个生成构造函数的 Lombok 注释。这意味着这个类没有无参数构造函数。
我使用了 Spring Boot 1.4.3.RELEASE,ObjectMapper bean 能够从 JSON 中反序列化此类对象。
升级到 Spring Boot 2.0.0.M7 后,我收到以下异常:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of PracticeResults (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
Spring Boot 1.4.3 中使用的 Jackson 版本是 2.8.10,而 Spring Boot 2.0.0.M7 中使用的是 2.9.2。
我试过用谷歌搜索这个问题,但只找到@JsonCreator 或@JsonProperty 的解决方案。
那么,为什么它适用于 Spring Boot 1.4.3 而适用于 Spring Boot 2?是否可以将 bean 配置为与旧版本相同的行为方式?
【问题讨论】:
-
只是想知道,您是否尝试将 Jackson 更新到最新的稳定版本 2.9.4?更改日志包含一些与地图反序列化相关的特定修复。 github.com/FasterXML/jackson/wiki/Jackson-Release-2.9.3
-
@LuisAguilar 我尝试了较新的版本,但没有任何改变。我有不同的 DTO,其中有一些字符串也无法反序列化。我认为这与 Spring 的对象映射器配置有关,但我找不到与默认构造函数相关的任何内容。
-
在每种情况下您使用的是哪个版本的 Lombok?
-
@AndyWilkinson 哇!我已经为 spring boot 1.4.3 尝试了新的 lombok 版本并且得到了同样的例外。是不是说lombok 1.16.12生成了带有
@Value注解的无参数构造函数? -
我尝试用谷歌搜索这个问题,但只找到
@JsonCreator或@JsonProperty的解决方案,这就是答案。 Jackson 要求构造函数上的这些注释知道如何将值映射到其中,或者它需要default no-args constructor,正如错误消息明确指出的那样,而您两者都没有,这就是它不起作用的原因。
标签: java spring spring-boot jackson lombok