2012-12-28 17 views
8

JSON serialization/deserialization için Jackson (2.1.1) kullanıyorum. JAXB ek açıklamaları ile mevcut bir dersim var. Bu açıklamaların çoğu doğrudur ve jackson ile olduğu gibi kullanılabilir. Bu sınıfların serileştirilmesini/serileştirilmesini biraz değiştirmek için mix-ins kullanıyorum. Yukarıdaki dayanarakJackson Jaxb Ek Açıklama Önceliği - @JsonProperty overriding @XmlTransient

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

, Jackson ek açıklamalar nedeniyle introspectors mertebesinde, JAXB'ın önceliklidir vardır: Benim ObjectMapper Yapıcıda

ben aşağıdakileri yapın. Bu Jackson Jaxb docs dayanmaktadır. Göz ardı edilmesini istediğim alanlar için, karıĢtırmadaki alana @JsonIgnore eklenmesi gayet iyi çalışıyor. Göz ardı edilmek istemediğim mevcut sınıflarda @XmlTransient olarak işaretlenmiş birkaç alan vardır. Mix-in alanında alana @JsonProperty eklemeyi denedim, ancak işe yaramıyor.

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

Bir fikrin nasıl orijinal sınıf değiştirmeden bu sorunu çözmek için:

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

karışıklık içindedir: Burada

orijinal sınıftır? Ben mix-in yaptığı gibi aynı davranışı almak gibi

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

:

Ben de onun yerine mix bileşenleri kullanarak üyelerine @JsonProperty ekleyerek test etti. @XmlTransient kaldırılmadığı sürece özellik göz ardı edilir.

cevap

7

sorun ya Introspector bir göz ardı işaretleyici algılarsa AnnotationIntrospectorPair.hasIgnoreMarker() yöntemi esas olarak @JsonProperty yoksaymasıdır:

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

ref: geçici bir çözüm github

için JaxbAnnotationIntrospector alt sınıfı

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); 
     } 
    } 
} 

Sonra sadece CustomJaxbAnnotationIntrospector kullanın: istenilen davranışı elde AnnotationIntrospectorPair.

İlgili konular