使用 Spring Boot 2 和 Kotlin 进行 Jackson 反序列化,无法构造 `java.time.LocalDate` 的实例

Posted

技术标签:

【中文标题】使用 Spring Boot 2 和 Kotlin 进行 Jackson 反序列化,无法构造 `java.time.LocalDate` 的实例【英文标题】:Jackson deserialization with Spring Boot 2 and Kotlin, Cannot construct instance of `java.time.LocalDate` 【发布时间】:2020-11-06 17:54:19 【问题描述】:

我收到此错误(请注意,我们谈论的是 LocalDate,而不是 LocalDateTime):

com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造java.time.LocalDate 的实例(没有创建者,如默认构造,存在):没有字符串参数构造函数/工厂方法可以从字符串值反序列化( '2012-03-12')

我一直在寻找这个问题,并尝试了其他答案中经常提到的“技巧”,例如(我一直在尝试这些技巧中的一个,并且我一直在以不同的方式组合它们):

    包括 com.fasterxml.jackson.datatype:jackson-datatype-jsr310 通过 bean 注册模块,告诉 Jackson ObjectMapper 使用 JavaTimeModule 尝试使用 jackson-module-kotlin 尝试来自 Jackson 的更多依赖项(不同组合) 将 spring 配置中的 write-dates-as-timestamps 设置为 false 将@JsonCreator 构造函数添加到数据类

我的 dto 数据类如下所示:

 data class DateDto (
    @JsonProperty("date")
    @JsonDeserialize(using = LocalDateDeserializer::class)
    @JsonSerialize(using = LocalDateSerializer::class)
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
    val date : LocalDate
 );

但是,这些技巧我没有运气,我不明白我做错了什么。

为什么这么难?我错过了一些非常明显的东西吗?我正在使用 Spring Boot 2.2.7、Kotlin 1.3.70、jackson-datatype-jsr310 2.11.1。

【问题讨论】:

这能回答你的问题吗? Usage of Jackson @JsonProperty annotation for kotlin data classes 不幸的是,添加 Visibility.ANY 没有区别 【参考方案1】:

事实证明,第 2 步实际上解决了我的问题。我需要为 ObjectMapper 注册一个 JavaTime 模块。我一定是做错了什么没有早点完成这项工作。

例如:

 var mapper = ObjectMapper() 
 .registerModule(KotlinModule())
 .registerModule(JavaTimeModule())

 mapper.readValue<DateDto>(message)

另外,例如,不需要包含 com.fasterxml.jackson.datatype:jackson-datatype-jsr310。您只需像这样包含 jackson-module-kotlin :

    <dependency>
        <groupId>com.fasterxml.jackson.module</groupId>
        <artifactId>jackson-module-kotlin</artifactId>
    </dependency>

使用 ObjectMapper 和 jackson-module-kotlin 似乎就足够了!但是,我会喜欢一些关于连载和杰克逊的好资源/书籍。它是如何在幕后工作的,以及如何在实践中与之相关。这是很多关于它的零散信息。如果我发现了什么,我会编辑这个答案。

【讨论】:

以上是关于使用 Spring Boot 2 和 Kotlin 进行 Jackson 反序列化,无法构造 `java.time.LocalDate` 的实例的主要内容,如果未能解决你的问题,请参考以下文章

如何启动 2.4.0 和 kotlin 1.4.20

使用 Spring Boot 2 和 Kotlin 进行 Jackson 反序列化,无法构造 `java.time.LocalDate` 的实例

Spring Boot 2 和 Kotlin 的“URL 未标准化”

在 spring-boot 中使用 kotlin 挂起函数创建名称为“requestMappingHandlerMapping”的 bean 时出错

带有 Spring Boot 2.0 @ConfigurationProperties 的 Kotlin 无法正常工作

是否可以在 Spring Boot 中使用 @Transactional 和 kotlin 协程?