2012-12-28 77 views
8

我正在使用Jackson(2.1.1)進行JSON序列化/反序列化。我有一個帶有JAXB註釋的現有類。大多數這些註釋都是正確的,可以像Jackson一樣使用。我正在使用混入來稍微改變這些類的反序列化/序列化。Jackson Jaxb註釋優先 - @JsonProperty重寫@XmlTransient

在我ObjectMapper構造我做到以下幾點:

setAnnotationIntrospector(AnnotationIntrospector.pair(
       new JacksonAnnotationIntrospector(), 
       new JaxbAnnotationIntrospector(getTypeFactory()))); 

基於上述,傑克遜註解優先於JAXB,因爲introspectors的順序。這是基於Jackson Jaxb docs。對於我想要忽略的字段,將@JsonIgnore添加到混音中的字段工作正常。在我不想忽略的現有類中有幾個字段被標記爲@XmlTransient。我曾嘗試在混音中添加@JsonProperty到該字段,但它似乎不起作用。

原來這裏是類:

public class Foo { 
    @XmlTransient public String getBar() {...} 
    public String getBaz() {...} 
} 

這裏是混合式:

public interface FooMixIn { 
    @JsonIgnore String getBaz(); //ignore the baz property 
    @JsonProperty String getBar(); //override @XmlTransient with @JsonProperty 
} 

任何想法如何解決這個不修改原班?

我還測試加入到@JsonProperty成員,而不是使用混合插件:

public class Foo { 
    @JsonProperty @XmlTransient public String getBar() {...} 
    @JsonIgnore public String getBaz() {...} 
} 

我似乎獲得相同的行爲,因爲我與混合式一樣。除非刪除@XmlTransient,否則該屬性將被忽略。

回答

7

的問題是,AnnotationIntrospectorPair.hasIgnoreMarker()方法基本上忽略@JsonProperty如果任一內部檢查檢測到一個忽略標記:

public boolean hasIgnoreMarker(AnnotatedMember m) { 
     return _primary.hasIgnoreMarker(m) || _secondary.hasIgnoreMarker(m); 
    } 

REF:github

一種解決方法是繼承JaxbAnnotationIntrospector到得到想要的行爲:

public class CustomJaxbAnnotationIntrospector extends JaxbAnnotationIntrospector { 
    public CustomJaxbAnnotationIntrospector(TypeFactory typeFactory) { 
     super(typeFactory); 
    } 

    @Override 
    public boolean hasIgnoreMarker(AnnotatedMember m) { 
     if (m.hasAnnotation(JsonProperty.class)) { 
      return false; 
     } else { 
      return super.hasIgnoreMarker(m); 
     } 
    } 
} 

然後只使用CustomJaxbAnnotationIntrospectorAnnotationIntrospectorPair