Sto usando JAXB per leggere e scrivere XML. Quello che voglio è usare una classe JAXB di base per il marshalling e una classe JAXB ereditata per unmarshalling. Questo per consentire a un'applicazione Java mittente di inviare XML ad un'altra applicazione Java del ricevitore. Il mittente e il destinatario condivideranno una libreria JAXB comune. Voglio che il ricevitore disattivi l'XML in una classe JAXB specifica del ricevitore che estenda la classe JAXB generica.JAXB inheritance, unmarshal alla sottoclasse della classe di marshalling
Esempio:
Questa è la classe comune JAXB che viene utilizzato dal mittente.
@XmlRootElement(name="person")
public class Person {
public String name;
public int age;
}
Questa è la classe JAXB specifica del ricevitore utilizzata quando si elimina l'XML. La classe ricevente ha una logica specifica per l'applicazione ricevente.
@XmlRootElement(name="person")
public class ReceiverPerson extends Person {
public doReceiverSpecificStuff() ...
}
Marshalling funziona come previsto. Il problema è con unmarshalling, è ancora unmarshal a Person
nonostante JAXBContext utilizzi il nome del pacchetto della sottoclasse ReceiverPerson
.
JAXBContext jaxbContext = JAXBContext.newInstance(package name of ReceiverPerson);
Quello che voglio è quello di unmarshall a ReceiverPerson
. L'unico modo in cui sono stato in grado di farlo è quello di rimuovere @XmlRootElement
da Person
. Sfortunatamente, ciò impedisce di eseguire il marshalling di Person
. È come se JAXB si avvii alla classe base e proceda fino a trovare il primo @XmlRootElement
con il nome appropriato. Ho provato ad aggiungere un metodo createPerson()
che restituisce ReceiverPerson
a ObjectFactory
ma ciò non aiuta.
Ho provato questo e non funziona. Qualunque cosa provi, ObjectFactory o il mio XmlAdapter non vengono mai chiamati. Da quello che ho letto, Sun's JAXB si risolve attraverso riferimenti di classe statici. Sembra che l'implementazione di Glassfish abbia più promesse https://jaxb.dev.java.net/guide/Adding_behaviors.html –
Gli XmlJavaAdapters sono adatti per rendere le classi con annotazione non JAXB utilizzabili con JAXB. Poiché Person e ReceiverPerson (e/o il loro superlass, se presente) hanno annotazioni JAXB, non funziona. Hai bisogno di Persona e ReceiverPerson senza JAXB, più adattatori per entrambi. –
Hai provato a scambiare i tipi per marshall | unmarshall? [...] estende XmlAdapter [...] @Override public ReceiverPerson unmarshal (Persona v) { return new ReceiverPerson (v); } @Override responsabile pubblico persona (ReceiverPerson v) { return v; } –