2011-05-17 26 views
5

Hola, Tengo 2 clases. Cuando intento crear una estructura XML a partir de ellos, solo obtengo el elemento raíz (A). ¿Por qué? ¿Estoy usando anotaciones equivocadas?Anotación JAXB para la jerarquía de clases

@XmlRootElement(name = "a") 
@XmlAccessorType(XmlAccessType.FIELD) 
public abstract class A{ 
    @XmlElement 
    int a; 

    protected A(){ 
    } 
} 

@XmlAccessorType(XmlAccessType.FIELD) 
public class B extends A{ 
    @XmlElement 
    int b; 

    protected B(){ 
    } 
}  
+0

Y tengo getters/setters por supuesto. – Udi

Respuesta

7

es probable que necesite usar @XmlSeeAlso anotación en su primera clase:

@XmlSeeAlso(B.class) 
@XmlRootElement(name = "a") 
@XmlAccessorType(XmlAccessType.FIELD) 
public abstract class A{ 

escribí 'probablemente', porque depende de cómo se configura su contexto JAXB. Básicamente, debe asegurarse de que JAXB conozca todas las clases que se supone deben ser serializadas. Si su clase B no se menciona en ningún otro lugar (por ejemplo, como un tipo de propiedad de una de las clases que ya conocen a ), entonces JAXB no tiene la oportunidad de saber cómo serializar las instancias de B. La intención de la anotación @XmlSeeAlso es asegurarse de que JAXB también tenga en cuenta estas clases enumeradas.

ACTUALIZACIÓN:

alternativa, se puede proporcionar la lista de todas las subclases al crear el objeto JAXBContext usando JAXBContext.newInstance(Class...), por ejemplo:

JAXBContext.newInstance(A.class, B.class); 

en lugar de

JAXBContext.newInstance(A.class); 

que probablemente ya hacer.

Pero mi opinión es que esta es una solución peor, porque te hace pensar en clases relacionadas cada vez que usas JAXB en tu código. En la solución superior establece las relaciones una vez para siempre.

+0

Gracias por la respuesta. Eso realmente funciona, pero es una solución tan mala orientada a objetos ... ¿Esa es la única manera? ¿JAXB no puede saberlo sin que yo le predique? – Udi

+0

@Udi: ver mi actualización –

+0

¡Gracias! Creo que eso es suficiente :) – Udi

Cuestiones relacionadas