2015-06-23 34 views
4

我正在使用杰克逊序列化/反序列化不可变的POJO。由于POJO是不可改变的,我将它们定义是这样的:杰克逊:允许财产命名策略与@JsonCreator合作

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,这工作的一种享受。然而,在杰克逊2.4中,明确命名@JsonProperty-annotated构造函数参数似乎超过了命名策略。

在我的POJO中重命名所有@JsonProperty注解是一个泄漏的抽象,我宁愿不这样做......所以还有另一种方法可以设置我的映射器或在全局范围内执行某些操作以将属性命名策略应用于这样的构造函数参数?

回答

2

您可能想要尝试更高版本:至少2.5(.4)或2.6.0-rc2(官方2.6.0应尽快出来,但在此之前)。 由于隐式名称(getter/setter,字段,构造函数参数名称)与显式覆盖(如@JsonProperty)之间的区分,导致此区域中存在已知的错误。 2.6.0修复了这些;我不是100%确定是否所有人都回到了2.5。

如果必须使用早期版本,您可以通过子类JacksonAnnotationIntrospector和压倒一切的findNameForSerialization()findNameForDeserialization()findImplicitPropertyName()来解决这个问题(或者相近的那些,看的javadoc),以及添加转换那里。这将是一个解决方法,但可以让你的东西工作,直到版本按预期工作。

+0

感谢 - 这通过重写'findNameForDeserialization'和'findImplicitPropertyName'。诀窍是通过使'findNameForDeserialization'返回'null'并使'findImplicitPropertyName'返回值来让Jackson相信这个声明是隐式的而非明确的。啊。 – Kkkev