J'utilise JAXB pour lire et écrire du XML. Ce que je veux, c'est utiliser une classe JAXB de base pour le marshalling et une classe JAXB héritée pour le unmarshalling. Le but est de permettre à une application Java émettrice d'envoyer du XML à une autre application Java réceptrice. L'émetteur et le récepteur partageront une bibliothèque JAXB commune. Je veux que le récepteur démarchande le XML dans une classe JAXB spécifique au récepteur qui étend la classe JAXB générique.
Ejemplo:
C'est la classe commune JAXB qui est utilisée par l'expéditeur.
@XmlRootElement(name="person")
public class Person {
public String name;
public int age;
}
Il s'agit de la classe JAXB spécifique au récepteur utilisée lors du désarchivage du XML. La classe du récepteur a une logique spécifique à l'application du récepteur.
@XmlRootElement(name="person")
public class ReceiverPerson extends Person {
public doReceiverSpecificStuff() ...
}
La maréchaussée fonctionne comme prévu. Le problème est que lors de la désarchivage, il y a toujours désarchivage vers Person
malgré le JAXBContext en utilisant le nom du paquetage de la sous-classe ReceiverPerson
.
JAXBContext jaxbContext = JAXBContext.newInstance(package name of ReceiverPerson);
Ce que je veux, c'est dé-maréchaliser pour ReceiverPerson
. Le seul moyen que j'ai trouvé pour y parvenir est de supprimer @XmlRootElement
de Person
. Malheureusement, cela empêche Person
de l'être. C'est comme si JAXB commençait par la classe de base et descendait jusqu'à trouver la première @XmlRootElement
avec le nom approprié. J'ai essayé d'ajouter un createPerson()
qui renvoie la méthode ReceiverPerson
a ObjectFactory
mais ça n'aide pas.