2015-06-23 33 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