2012-07-11 22 views
5

Nella mia applicazione l'uscita JAXB genera come:JAXB per JSON utilizzando JACKSON

this.marshalOut(jaxb_Object, fileOutputStream);

questo è chiamata al metodo alla primavera Object marshaller Mapping XML che generano file XML. Ora, mi piace anche generare file JSON dopo questa riga. Qualcuno ha idea di generare output JSON usando l'input JAXB.

Ho trovato questo esempio di codice in linea:

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

Il setAnnotationIntrospector è deprecato, c'è qualche altro modo per risolvere questo problema?

+0

Potresti essere interessato al supporto object-to-JSON che abbiamo aggiunto a EclipseLink JAXB (MOXy): http://blog.bdoughan.com/2011/08/json-binding-with-eclipselink-moxy. html –

+0

Ho bisogno di qualcosa usando Jackson, perché stiamo usando jackson nel nostro progetto. – user1417746

+0

Hai guardato Spring's MappingJacksonHttpMessageConverter? Se non stai utilizzando HttpMessageConverters, la fonte potrebbe almeno darti alcuni suggerimenti. – MattR

risposta

0

Secondo il 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 

Hai controllato il metodo withAnnotationIntrospector(AnnotationIntrospector ai) di vedere anche depurato o no che sia utile nel vostro caso?

2

La soluzione corretta per me è stato:

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

I seguenti lavori (e non utilizza alcun costruttore obsoleto):

ObjectMapper mapper = new ObjectMapper(); 

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

mapper.setAnnotationIntrospector(introspector); 

Specificamente, questa linea

new JaxbAnnotationIntrospector(mapper.getTypeFactory()); 

utilizza un costruttore non obsoleto. Ho provato questo ed elabora con successo JAXB Annotations (come @XmlTransient, nel mio caso).

+0

JaxbAnnotationIntrospector.java è disponibile in jackson-module-jaxb-annotations-2.6.2.jar –

+0

@Michael Christoff Brilliant! Anche questo ha funzionato nel mio caso. Grazie mille. –

2

È possibile utilizzare jackson-module-jaxb-annotations come indicato nel documento è possibile registrare un modulo JaxbAnnotationModule:

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

In questo modo è ora possibile utilizzare sia annotazioni JAXB e Jackson annotazioni nativo.

Problemi correlati