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
.