2011-03-30 20 views
5

me dan XML que se parece mucho más atributos (por supuesto):JAXB - objetos polimórficos unmarshalling

<inventory> 
    <item kind="GRILL" tag=123 brand="WEBER"/> 
    <item kind="CAR" tag=124 make="FORD" model="EXPLORER" /> 
</inventory> 

con alrededor de una docena de tipos diferentes. Estoy utilizando anotaciones para asignar a las clases de Java que se parecen:

@XmlRootElement(name="inventory") 
public class Inventory { 
    @XmlElement(name="item") 
    public List<Item> itemList = new LinkedList<Item>; 
} 
abstract public class Item { 
    @XmlAttribute public int tag; 
} 
public class Grill extends Item { 
    @XmlAttribute public string brand; 
} 
public class Car extends Item { 
    @XmlAttribute public string make; 
    @XmlAttribute public string model; 
} 

¿Cómo puedo obtener JAXB para crear los objetos de elemento sub-clasificarse según el campo "tipo"?

+0

posible duplicado de [Java/JAXB: Unmars hall Xml a una subclase específica basada en un atributo] (http://stackoverflow.com/questions/2992234/java-jaxb-unmarshall-xml-to-speccific-subclass-based-on-an-attribute) –

+0

tienes razón ... Hice una búsqueda antes de publicar, pero de alguna manera me lo perdí. – dave

Respuesta

4

Hay zona de par de diferentes enfoques:

JAXB (JSR-222)

El siguiente enfoque debería funcionar con cualquier aplicación JAXB (Metro, moxy, JaxMe, etc). Use un XmlAdapter donde el objeto adaptado contenga las propiedades de la clase padre y todas las subclases. En XmlAdapter, agregue la lógica de cuándo se debe usar una determinada subclase. Para ver un ejemplo, consulte el enlace a una pregunta similar a continuación:

EclipseLink JAXB (moxy)

Se podría utilizar la extensión @XmlDescriminatorNode en EclipseLink JAXB (MOXy) para manejar este caso de uso .

Salida mi respuesta a una pregunta similar:

Hemos mejorado este apoyo en la liberación EclipseLink 2.2:

+0

Gracias, esa es una buena respuesta, pero tendré que obtener la aprobación de mis técnicos de TI para incluirla en nuestra plataforma de servidores. – dave

+0

Mientras tanto, ¿hay algún ejemplo de hacerlo en la versión estándar con un adaptador? – dave

+0

Si bien no existe una versión estándar de JAXB (las implementaciones de Java SE 6 solo son necesarias para proporcionar una aplicación JAXB), he actualizado mi respuesta con un enfoque que funcionará con cualquier implementación de JAXB. –

Cuestiones relacionadas