2012-12-28 14 views
8

मैं जेएसओएन क्रमबद्धता/deserialization के लिए जैक्सन (2.1.1) का उपयोग कर रहा हूँ। मेरे पास जेएक्सबी एनोटेशन के साथ एक मौजूदा कक्षा है। इनमें से अधिकतर टिप्पणियां सही हैं और जैक्सन के साथ-साथ इसका उपयोग भी किया जा सकता है। मैं इन वर्गों के deserialization/serialization में थोड़ा बदलाव करने के लिए मिश्रण-इन्स का उपयोग कर रहा हूँ।जैक्सन जैक्सब एनोटेशन प्राथमिकता - @ जेसनप्रोपर्टी ओवरराइडिंग @XmlTransient

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

ऊपर के आधार पर, जैक्सन एनोटेशन पूर्वता JAXB से अधिक, introspectors के आदेश की वजह से है:

मेरी ObjectMapper निर्माता में मैं निम्न कार्य करें। यह जैक्सन जैक्सब docs पर आधारित है। उन क्षेत्रों के लिए जिन्हें मैं अनदेखा करना चाहता हूं, मिश्रण में फ़ील्ड में @JsonIgnore जोड़ना ठीक काम कर रहा है। ऐसे कुछ फ़ील्ड हैं जिन्हें मौजूदा कक्षाओं में @XmlTransient के रूप में चिह्नित किया गया है जिन्हें मैं अनदेखा नहीं करना चाहता हूं। मैंने मिश्रण में फ़ील्ड में @JsonProperty जोड़ने का प्रयास किया है, लेकिन ऐसा लगता है कि यह काम नहीं करता है।

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

किसी भी विचार कैसे मूल वर्ग को संशोधित करने के बिना इस को हल करने:

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

यहाँ मिश्रण में है:

यहाँ मूल वर्ग है?

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

मैं के रूप में मैं मिश्रण में के साथ किया था समान व्यवहार प्राप्त करने लगते हैं:

मैं भी बजाय मिश्रण-इन का उपयोग कर के सदस्यों के लिए @JsonProperty जोड़ने का परीक्षण किया। जब तक @XmlTransient को हटाया नहीं जाता है, तो संपत्ति को अनदेखा किया जाता है।

उत्तर

7

मुद्दा यह है कि AnnotationIntrospectorPair.hasIgnoreMarker() विधि मूल रूप से @JsonProperty पर ध्यान नहीं देता या तो introspector एक उपेक्षा मार्कर का पता लगाता है, यदि:

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

रेफरी: 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); 
     } 
    } 
} 

फिर बस CustomJaxbAnnotationIntrospector का उपयोग करें AnnotationIntrospectorPair में।

संबंधित मुद्दे