xmlmapper new examples deserializar convert json jaxb jackson

json - new - spring boot convert object to xml string



Precedencia de anotaciĆ³n de Jackson Jaxb-@JsonProperty que anula @XmlTransient (1)

Estoy usando Jackson (2.1.1) para la serialización / deserialización JSON. Tengo una clase existente con anotaciones JAXB. La mayoría de estas anotaciones son correctas y se pueden usar tal como están con jackson. Estoy usando mix-ins para alterar ligeramente la deserialización / serialización de estas clases.

En mi constructor ObjectMapper hago lo siguiente:

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

En base a lo anterior, las anotaciones de Jackson tienen precedencia sobre Jaxb, debido al orden de los introspectores. Esto se basa en los documentos de Jackson Jaxb. Para los campos que deseo ignorar, agregar @JsonIgnore al campo en la mezcla está funcionando bien. Hay un par de campos que están marcados como @XmlTransient en las clases existentes que no quiero ignorar. He intentado agregar @JsonProperty al campo en la mezcla, pero parece que no funciona.

Aquí está la clase original:

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

Aquí está el mix-in:

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

¿Alguna idea de cómo resolver esto sin modificar la clase original?

También probé agregar @JsonProperty a los miembros en lugar de usar mix-ins:

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

Parece que tengo el mismo comportamiento que con el mix-in. A menos que se elimine @XmlTransient, la propiedad se ignora.


El problema es que el método AnnotationIntrospectorPair.hasIgnoreMarker () básicamente ignora @JsonProperty si introspector detecta un marcador de ignorar:

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

ref: github

Una solución alternativa es crear una subclase de JaxbAnnotationIntrospector para obtener el comportamiento deseado:

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

A continuación, utilice CustomJaxbAnnotationIntrospector en AnnotationIntrospectorPair .