SpringBoot + Jackson + Kotlin 数据类:忽略字段注释

Posted

技术标签:

【中文标题】SpringBoot + Jackson + Kotlin 数据类:忽略字段注释【英文标题】:SpringBoot + Jackson + Kotlin data class : Field annotations ignored 【发布时间】:2018-05-20 09:48:58 【问题描述】:

我正在使用带有 Kotlin 和 Java8 时间的 Spring Boot。不知何故,数据类字段上的 Jackson 注释被忽略了。

import com.fasterxml.jackson.annotation.JsonProperty
import java.time.MonthDay

data class DataView(val id: String,
                    @get:JsonProperty("dayOfMonth") val monthDay: MonthDay) 

为什么会忽略这些注释?响应仍然包含字段名称“monthDay”。

根据discuss.kotlinlang.org 上的讨论,我知道注释是正确的。

据我所知,我没有任何会影响这一点的配置。

pom 包含:

...
<parent>
    <artifactId>spring-boot-starter-parent</artifactId>
    <groupId>org.springframework.boot</groupId>
    <version>1.5.6.RELEASE</version>
    <relativePath/>
</parent>
...
    <dependency>
        <groupId>com.fasterxml.jackson.module</groupId>
        <artifactId>jackson-module-kotlin</artifactId>
        <version>$jackson.version</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-hibernate5</artifactId>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-hppc</artifactId>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jsr310</artifactId>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-json-org</artifactId>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.module</groupId>
        <artifactId>jackson-module-afterburner</artifactId>
    </dependency>
...

【问题讨论】:

反对者是否愿意解释为什么他们认为这不是一个好问题? 【参考方案1】:

很奇怪。我在本地检查了这段代码,一切看起来都很好

data class DataView(val id: String,
                     @get:JsonProperty("dayOfMonth") val monthDay: MonthDay)

data class MonthDay(val day: Int)

fun main(args: Array<String>) 
    val objectMapper = ObjectMapper()
            .registerKotlinModule()

    val dataView = DataView("someId", MonthDay(1))

    //"id":"someId","dayOfMonth":"day":1
    println(objectMapper.writeValueAsString(dataView))

即使我删除 registerKotlinModule 并将 @get 更改为 @field,它的工作原理也是一样的。

【讨论】:

感谢您的努力。就我而言,我使用的是 java.time.MonthDay,但我认为这可能与 Spring Boot 和 MappingJackson2HttpMessageConverter 有关。 您可以尝试从项目中排除所有 jackson-datatype* 模块并检查 m.b 它会有所帮助。正如您在空项目中看到的,一切正常,所以在 Spring 中配置的 ObjectMapper 中存在问题。

以上是关于SpringBoot + Jackson + Kotlin 数据类:忽略字段注释的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot + Jackson + Kotlin 数据类:忽略字段注释

springboot之jackson的两种配置方式

Springboot JackSon

Azure + SpringBoot 'com/fasterxml/jackson/core/JsonFactory'

SpringBoot全局Jackson配置未生效

springboot 底层 JackSon 的使用