对于任何Kotlin类,都会以componentX()
格式为每个公共属性生成一个方法,所以这个类:
public data class Dog(public var name: String, public var age: Double)
在Java中等同于这样的东西:
public class Dog {
private String name;
private double age;
public Dog(@NotNull String name, @NotNull double age) {
// assign values
}
// Getters and setters for name and age
// toString(), equals(), and hashCode()
public String component1() { return name; }
public double component2() { return age; }
}
这与杰克逊混淆,因为它将每个componentX()
方法和每个getXxx()
方法视为(反)序列化目标。
直到现在我一直在解决这个问题的方法是用Java创建我的所有模型,这不是首选。
简而言之,我如何配置ObjectMapper以忽略componentX()
方法?
答案 0 :(得分:1)
除了自定义序列化器/反序列化器之外,还要看看@JsonFilter。它可以使用mixin应用,您可以使用自定义逻辑,例如过滤掉所有以componentX开头的属性。
以下是解释如何创建自定义过滤器的文档: http://wiki.fasterxml.com/JacksonFeatureJsonFilter这很简单。
可能有更好的方法,但这应该有效。
编辑:同时查看http://wiki.fasterxml.com/JacksonJsonViews。这更像是一种静态的方法来定义可以忽略的属性,所以我不认为这对你有用,过滤器可能更好。
答案 1 :(得分:0)
注意: 不需要在接受的答案中描述@JsonFilter的详细信息
杰克逊的默认行为不需要任何东西。使用当前和最近的Jackson版本,没有如所描述的这样的行为。有时Google会显示打包为org.codehaus.*
而不是com.fasterxml.*
在Jackson中,如果该属性看起来不像JavaBean属性,则不会反序列化。 componentX
看起来不像JavaBean属性。
这是一个测试案例,证明使用原始Jackson和Jackson Module for Kotlin两者都按预期工作,并且都没有这个问题。
class StackOverflowTest {
public data class Dog(public var name: String, public var age: Double)
@Test public fun testSimpleDeser() {
val dogObj = Dog("Avi", 1.5)
val expectedJson = """{"name":"Avi","age":1.5}"""
assertEquals(expectedJson, ObjectMapper().writeValueAsString(dogObj))
assertEquals(expectedJson, jacksonObjectMapper().writeValueAsString(dogObj))
}
}
我与杰克逊2.6.4
进行了测试,但我确信2.5.x
,2.6.x
或2.7.x
都没有此问题,因为这些问题都与Kotlin一起使用很长一段时间了。