我正在使用Jackson来序列化/反序列化不可变的POJO.由于POJO是不可变的,我将它们定义为:
class Foo {
private final String bar;
private final String wibbleBoing;
@JsonCreator
public Foo(@JsonProperty("bar") String bar, @JsonProperty("wibbleBoing") wibbleBoing) {
this.bar = bar;
this.wibbleBoing = wibbleBoing;
}
... [getters] ...
}
我被迫在构造函数参数上使用@JsonProperty,因为Java字节码不包含参数名称. [实际上,我知道它可以用于Java 8,我可以使用jackson-module-parameter-names来规避它,但现在这不是我的选择].
现在,让我们假设我也想使用属性命名策略,这样我就可以将所有属性名称更改为带有下划线的小写而不是驼峰,并且这样我就不必更改我的现有的POJO.
在杰克逊2.3中,这是一种享受.但是,在Jackson 2.4中,@ JsonProperty注释构造函数参数的显式命名似乎胜过了命名策略.
重命名我的POJO中的所有@JsonProperty注释是一个漏洞抽象,我宁愿不这样做……所以有另一种方法可以设置我的映射器或全局做一些事情来将属性命名策略应用于这样的构造函数参数?
最佳答案 您可能想要尝试更高版本:至少2.5(.4)或2.6.0-rc2(官方2.6.0应尽快出来,但在此之前).
此区域中存在已知错误,这是由隐式名称(getter / setter,字段,构造函数参数名称)和显式覆盖(如@JsonProperty)之间的划分产生的. 2.6.0修复了这些;我不是百分百确定是否所有都是2.5后向后移植.
如果必须使用早期版本,则可以通过对JacksonAnnotationIntrospector进行子类化并重写findNameForSerialization(),findNameForDeserialization()和findImplicitPropertyName()(或接近这些,请参阅javadocs)并在其中添加转换来解决问题.这将是一种解决方法,但允许您使工作正常,直到版本按预期工作.