2010-08-06 16 views
5

Tengo la siguiente clase javaEncuadernación una clase Java genérica a un JSON utilizando JAXB

@XmlRootElement 
@XmlSeeAlso(DataClass.class) 
public static class EnvelopeClass<T> { 

    @XmlElement 
    public String version; 

    @XmlElement 
    public T data; 

    EnvelopeClass() { 
    } 

    EnvelopeClass(String version, T data) { 
     this.version = version; 
     this.data = data; 
    } 

} 

@XmlRootElement 
public static class DataClass { 

    @XmlElement 
    public String name; 

    DataClass() { 
    } 

    DataClass(String name) { 
     this.name = name; 
    } 

} 

estoy creando su instancia y cálculo de referencias a JSON

EnvelopeClass<DataClass> dataClassEnvelopeClass = new EnvelopeClass<DataClass>("1.0", new DataClass("myName")); 

Tengo siguiente resultado:

{"version":"1.0","data":{"@type":"dataClass","name":"myName"}} 

no quiere tener información de tipo de tipo JSON en el "@type": "DATACLASS", en otras palabras, quiero tener siguiente resultado:

{"version":"1.0","data":{"name":"myName"}} 

Exactamente este resultado cuando tengo EnvelopeClass no tiene genéricos.

¿Hay alguna manera de hacerlo?

+0

Cuando intento esto con la "vainilla" JAXB en java6, no lo creo obtengo eso, obtengo ' 1.0 myName ', donde el' xsi: type' es como se supone que los genéricos deben hacerse en JAXB. – skaffman

Respuesta

6

Para obtener el comportamiento deseado, puede usar @XmlAnyElement en la propiedad de datos en lugar de @XmlElement. Para la propiedad @XmlAnyElement, el valor corresponderá a una clase con la anotación @XmlRootElement correspondiente.

EnvelopeClass

import javax.xml.bind.annotation.XmlAnyElement; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlSeeAlso; 

@XmlRootElement 
@XmlSeeAlso(DataClass.class) 
public class EnvelopeClass<T> { 

    @XmlElement 
    public String version; 

    @XmlAnyElement 
    public T data; 

    EnvelopeClass() { 
    } 

    EnvelopeClass(String version, T data) { 
     this.version = version; 
     this.data = data; 
    } 

} 

DATACLASS

import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement(name="data") 
public class DataClass { 

    @XmlElement 
    public String name; 

    DataClass() { 
    } 

    DataClass(String name) { 
     this.name = name; 
    } 

} 

demostración

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Marshaller; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(EnvelopeClass.class); 

     DataClass data = new DataClass("myName"); 
     EnvelopeClass envelope = new EnvelopeClass<DataClass>("1.0", data); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(envelope, System.out); 
    } 
} 
Cuestiones relacionadas