2012-07-11 14 views
5

En mi solicitud la salida JAXB genera como:JAXB a JSON usando JACKSON

this.marshalOut(jaxb_Object, fileOutputStream);

este es el método llamado a los señaleros objeto Spring asignación XML que generan archivos XML. Ahora, también me gusta generar archivos JSON después de esta línea. Cualquiera tiene idea de generar salida JSON usando la entrada JAXB.

yo encontramos este código de ejemplo en línea:

ObjectMapper mapper = new ObjectMapper(); 
AnnotationIntrospector introspector = new JacksonAnnotationIntrospector(); 
// make deserializer use JAXB annotations (only) 
mapper.getDeserializationConfig().setAnnotationIntrospector(introspector); 
// make serializer use JAXB annotations (only) 
mapper.getSerializationConfig().setAnnotationIntrospector(introspector); 
mapper.writeValue(outputStream, jaxb_object); 

El setAnnotationIntrospector está en desuso, ¿hay alguna otra manera de resolver este problema?

+0

Puede que le interese el soporte de objeto-a-JSON que hemos agregado a EclipseLink JAXB (MOXy): http://blog.bdoughan.com/2011/08/json-binding-with-eclipselink-moxy. html –

+0

Necesito cualquier cosa usando Jackson, porque estamos usando jackson en nuestro proyecto. – user1417746

+0

¿Has mirado Spring's MappingJacksonHttpMessageConverter? Si no está utilizando HttpMessageConverters, la fuente podría al menos darle algunas pistas. – MattR

Respuesta

0

Según el javadoc Jackson:

setAnnotationIntrospector 

@Deprecated 
public final void setAnnotationIntrospector(AnnotationIntrospector ai) 

    Deprecated. Since 1.8, use either withAnnotationIntrospector(AnnotationIntrospector) or Module API instead 

    Method for replacing existing annotation introspector(s) with specified introspector. Since this method modifies state of configuration object directly, its use is not recommended 

¿verificó el método withAnnotationIntrospector(AnnotationIntrospector ai) para ver wheter es o no es útil en su caso?

2

La solución correcta para mí fue:

ObjectMapper objectMapper = new ObjectMapper(); 
objectMapper.setAnnotationIntrospector(new JaxbAnnotationIntrospector()); 
4

Los siguientes obras (y no utiliza ningún constructor en desuso):

ObjectMapper mapper = new ObjectMapper(); 

AnnotationIntrospector introspector = 
    new JaxbAnnotationIntrospector(mapper.getTypeFactory()); 

mapper.setAnnotationIntrospector(introspector); 

Específicamente, esta línea

new JaxbAnnotationIntrospector(mapper.getTypeFactory()); 

utiliza un constructor no desuso. Lo he probado y procesa con éxito las anotaciones de JAXB (como @XmlTransient, en mi caso).

+0

JaxbAnnotationIntrospector.java está disponible en jackson-module-jaxb-annotations-2.6.2.jar –

+0

@Michael Christoff Brilliant! Esto funcionó en mi caso también. Muchas gracias. –

2

Puede utilizar jackson-module-jaxb-annotations como se indica en el documento se puede registrar un módulo JaxbAnnotationModule:

JaxbAnnotationModule module = new JaxbAnnotationModule(); 
// configure as necessary 
objectMapper.registerModule(module); 

Si lo hace, ahora se puede utilizar tanto en anotación JAXB y Jackson anotación nativa.

Cuestiones relacionadas