2010-08-06 5 views
5

Ich habe folgende Java-KlasseBindung eine generische Java-Klasse zu einem JSON JAXB mit

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

} 

ich seine Instanz bin zu schaffen und es

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

ich als nächstes Ergebnis JSon Marshalling haben:

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

ich will nicht Typ Typinformationen in den json "@type" haben: "Dataclass", mit anderen Worten möchte ich als nächstes Ergebnis haben:

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

Genau dieses Ergebnis habe ich, wenn EnvelopeClass Generics nicht haben.

Gibt es eine Möglichkeit, dies zu tun?

+0

Als ich dies mit der "Vanille" JAXB in Java6 versuchen, das tue ich nicht bekomme ich das, bekomme ich ' 1.0 meinName ', wo der' xsi: type' ist, wie Generika in JAXB gemacht werden sollen. – skaffman

Antwort

6

Um das gewünschte Verhalten zu erhalten, können Sie @XmlAnyElement für die Eigenschaft data anstelle von @XmlElement verwenden. Für die @ XmlAnyElement-Eigenschaft entspricht der Wert einer Klasse mit der entsprechenden @ XmlRootElement-Annotation.

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

} 

Demo

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