Comment marshaler un objet via JAXB sans aucune information à ce sujet?
J'ai un objet value
qui est d'un certain type, soit @XmlRootElement
-annotées, ou pas. Je veux maréchal en XML:
String value1 = "test";
assertEquals("<foo>test</foo>", toXml("foo", value1));
//...
@XmlRootElement
class Bar {
public String bar = "test";
}
assertEquals("<foo><bar>test</bar></foo>", toXml("foo", new Bar()));
Puis-je le faire avec JAXB installations existantes, ou, devrais-je créer un certain analyseur personnalisé?
source d'informationauteur yegor256
Vous devez vous connecter pour publier un commentaire.
Vous pourriez tirer parti de JAXBIntrospector pour effectuer les opérations suivantes:
Avec le code ci-dessus lorsque le JAXBElement est mobilisé, il sera qualifié avec un attribut xsi:type correspondant à la appropriée du type de schéma:
Pour éliminer la qualification, il vous suffit de modifier la ligne qui crée la JAXBElement:
Cela se traduira dans le code XML suivant:
Ici est de savoir comment le maréchal
value1
qui est unString
. Vous pouvez passeryourObject.getClass()
à laJAXBElement
constructeur, etvalue1
:Cela fonctionne sans l'aide de
@XmlRootElement
. Le résultat du code ci-dessus a été:Sur l'autre partie, cela ne fonctionnera pas avec un
Bar
objet:javax.xml.bind.JAXBException: myPackage.Bar is not known to this context
. Cependant, vous pouvez obtenir la valeur de l'intérieur deBar
et de créer lesJAXBElement
avec qui, pas de l'objet lui-même.Je n'ai pas trouver une bonne méthode générique de le faire. Voici ma solution générique.
Si ce n'est pas annoté avec
@XmlRootElement
puis JAXB ne dispose pas de suffisamment d'informations pour le maréchal. Vous devez envelopper dans unJAXBElement
premier.Pourriez-vous faire quelques réfléchissant lovin' pour savoir comment envelopper l'objet dans la
JAXBElement
?