Estoy usando JAXB para leer y escribir en XML. Lo que quiero es usar una clase JAXB base para clasificación y una clase JAXB heredada para desasignación. Esto es para permitir que una aplicación Java del remitente envíe XML a otra aplicación Java receptora. El emisor y el receptor compartirán una biblioteca JAXB común. Quiero que el receptor desmarque el XML en una clase JAXB específica del receptor que amplíe la clase JAXB genérica.Herencia de JAXB, unmarshal a la subclase de la clase marshaled
Ejemplo:
Esta es la clase JAXB común que se utiliza por el remitente.
@XmlRootElement(name="person")
public class Person {
public String name;
public int age;
}
Esta es la clase JAXB específica del receptor que se utiliza al desmaterializar el XML. La clase de receptor tiene lógica específica para la aplicación del receptor.
@XmlRootElement(name="person")
public class ReceiverPerson extends Person {
public doReceiverSpecificStuff() ...
}
Marshalling funciona como se esperaba. El problema es con la desasignación, todavía no coincide con Person
a pesar de que JAXBContext usa el nombre del paquete de la subclase ReceiverPerson
.
JAXBContext jaxbContext = JAXBContext.newInstance(package name of ReceiverPerson);
Lo que yo quiero es Resolver referencia a ReceiverPerson
. La única forma que he podido hacer esto es eliminar @XmlRootElement
de Person
. Desafortunadamente, esto impide que se ordene el Person
. Es como si JAXB comienza en la clase base y sigue su camino hasta que encuentra el primer @XmlRootElement
con el nombre apropiado. He intentado agregar un método createPerson()
que devuelve ReceiverPerson
a ObjectFactory
pero eso no ayuda.
Intenté esto y no funciona. No importa lo que intente, ObjectFactory o mi XmlAdapter nunca se llama. Por lo que he leído, JAXB de Sun se resuelve a través de referencias de clases estáticas. Parece que la implementación de Glassfish es más prometedora https://jaxb.dev.java.net/guide/Adding_behaviors.html –
Los XmlJavaAdapters son adecuados para hacer que clases con anotaciones JAXB no se puedan usar con JAXB. Debido a que Person y ReceiverPerson (y/o su superclase, si lo hay) tienen anotaciones JAXB, no funciona. Necesita Persona y ReceiverPerson sin JAXB, además de adaptadores para ambos. –
¿Has probado el intercambio de tipos para marshall | unmarshall? [...] extiende XmlAdapter [...] @Override public ReceiverPerson unmarshal (Person v) { return new ReceiverPerson (v); } @Override public Person mariscal (ReceiverPerson v) { return v; } –