【问题标题】:Jackson does not recognize weird property names after upgrade杰克逊升级后无法识别奇怪的属性名称
【发布时间】:2021-08-14 10:57:41
【问题描述】:

升级到 Jackson 2.12.3 后,奇怪的 Kotlin 属性似乎不再受支持:

Caused by: java.lang.IllegalArgumentException:
Conflicting getter definitions for property "fSRI": com.example.ModelRow#getFSRI-SECTION() vs com.example.ModelRow#getFSRI-ID()

完整的测试用例:

import com.fasterxml.jackson.databind.DeserializationFeature
import com.fasterxml.jackson.databind.MapperFeature
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
import com.fasterxml.jackson.module.kotlin.KotlinModule
import com.fasterxml.jackson.module.kotlin.convertValue
import org.junit.jupiter.api.Test

class JacksonTest {

    @Test
    fun doTest() {
        val map = mapOf( "FSRI-SECTION" to "1", "FSRI-ID" to "1234")
        objectMapper().convertValue<MyModel>(map)
    }

    data class MyModel(
        val `FSRI-ID`: String?,
        val `FSRI-SECTION`: Int?
    )

    private fun objectMapper(): ObjectMapper {
        return ObjectMapper()
            .registerModule(KotlinModule(nullToEmptyCollection = true, nullIsSameAsDefault = true))
            .registerModule(JavaTimeModule())
            .registerModule(Jdk8Module())
            .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
            .configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false)
    }

}

它在 2.11.3 中运行良好。

【问题讨论】:

    标签: kotlin jackson jackson-databind


    【解决方案1】:

    您需要启用字段匹配,而不是 getters。你可以为ObjectMapper定义这个:

    private fun objectMapper(): ObjectMapper {
        val mapper = ObjectMapper()
            .registerModule(KotlinModule(nullToEmptyCollection = true, nullIsSameAsDefault = true))
            .registerModule(JavaTimeModule())
            .registerModule(Jdk8Module())
            .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
            .configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false)
    
        return mapper.setVisibility(mapper.visibilityChecker
            .withGetterVisibility(JsonAutoDetect.Visibility.NONE)
            .withFieldVisibility(JsonAutoDetect.Visibility.ANY))
    }
    

    或者只注释给定的类:

    @JsonAutoDetect(getterVisibility = NONE, fieldVisibility = ANY)
    data class MyModel(
    

    在这两种情况下它都应该工作并打印:

    MyModel(FSRI-ID=1234, FSRI-SECTION=1)
    

    另见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-14
      • 2015-09-28
      • 2021-01-09
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多