升级后 Jackson 无法识别奇怪的 属性 个名字
Jackson does not recognize weird property names after upgrade
升级到 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 上运行良好。
您需要启用字段匹配,而不是 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))
}
或只注释给定class:
@JsonAutoDetect(getterVisibility = NONE, fieldVisibility = ANY)
data class MyModel(
在这两种情况下它都应该工作并打印:
MyModel(FSRI-ID=1234, FSRI-SECTION=1)
另请参阅:
- How to ignore "Is' methods with Jackson 2.2.3
升级到 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 上运行良好。
您需要启用字段匹配,而不是 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))
}
或只注释给定class:
@JsonAutoDetect(getterVisibility = NONE, fieldVisibility = ANY)
data class MyModel(
在这两种情况下它都应该工作并打印:
MyModel(FSRI-ID=1234, FSRI-SECTION=1)
另请参阅:
- How to ignore "Is' methods with Jackson 2.2.3