Java JaxB - Objet à Chaîne XML pour Objet
J'ai un problème à l'aide de JaxB dans Netbeans 7.1.2.
J'ai généré automatiquement mes classes à partir d'un schéma à l'aide de JaxB (Nouveau JaxB de Liaison). Je suis la création de l'objet qui va être sérialisé en XML chaîne à l'aide de la Marshaller et ensuite revenir à une nouvelle instance de l'objet à partir de la Chaîne XML. Cependant, je reçois l'exception suivante:
javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.somewhere.com/some/path", local:"MyQueryComplexTypeQuery"). Expected elements are (none)
Le marshalling/sérialisation XML chaîne fonctionne très bien. C'est quand il est unmarshalled/désérialisé qui est à l'origine du problème.
J'utilise le code suivant pour construire l'objet et le maréchal à une chaîne de caractères XML:
//build the object
ObjectFactory of = new ObjectFactory();
MyQueryComplexType oaaqc = of.createMyQueryComplexType();
oaaqc.setField1("edit");
oaaqc.setField2("net");
oaaqc.setField3("24");
JAXBElement<MyQueryComplexType> createMyQueryComplexType = of.createMyQueryComplexTypeQuery(oaaqc);
//serialise to xml
StringWriter writer = new StringWriter();
JAXBContext context = JAXBContext.newInstance(MyQueryComplexType.class);
Marshaller m = context.createMarshaller();
m.marshal(createMyQueryComplexType, writer);
//output string to console
String theXML = writer.toString();
System.out.println(theXML);
Ce produit le code XML suivant (formaté) dans la console:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MyQueryComplexTypeQuery xmlns="http://www.somewhere.com/some/path">
<Field1>edit</Field1>
<Field2>net</Field2>
<Field3>24</Field3>
</MyQueryComplexTypeQuery>
J'en viens maintenant à désérialiser/unmarshal la chaîne à une nouvelle instance MyQueryComplexType avec le code suivant:
Unmarshaller u = context.createUnmarshaller();
MyQueryComplexTypeQuery o = (MyQueryComplexType) u.unmarshal(new StringReader(theXML));
Dans la génération automatique d'package-info.java elle a le contenu suivant:
@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.somewhere.com/some/path", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package MyProject.SomeNamespace.MyQuery;
Je pensais que le simple processus de l'objet -> chaine -> objet de travail. C'est la première fois que j'ai utilisé JaxB (doux). J'ai vu d'autres posts mentionnant les espaces de noms, et tout semble ok pour moi. J'ai généré automatiquement les classes à partir du schéma, construit l'objet, rassemblées pour la chaîne xml. J'ai pensé, il suffit d'inverser le processus pour unmarshal serait similaire.
L'exception est levée en ligne:
MyQueryComplexTypeQuery o = (MyQueryComplexType) u.unmarshal(new StringReader(theXML));
Je pensais que je faisais la unmarshalling de la chaîne d'objet serait simple. Je ne sais pas si je fais quelque chose de mal ou manque quelque chose. J'espère que vous les gars peuvent éclairer ou m'ouvrir les yeux.
J'ai coupé le code de simplifier ce qui est dans mon application qui provoque l'erreur. Les espaces de noms ont été changés pour protéger l'identité des choses sur le web.
Toutes les pensées?
Grâce
Andez
OriginalL'auteur Andez | 2012-11-08
Vous devez vous connecter pour publier un commentaire.
De la création de la
JAXBContext
Pour JAXB modèles qui sont générés à partir d'un schéma XML, vous pouvez créer le
JAXBContext
sur le nom du paquet plutôt que sur une classe particulière:Pas:
Cela permettra d'assurer que le
ObjectFactory
classe qui contient la@XmlElementDecl
annotations est traitée correctement, qui est ce qui est manquant dans votre cas d'utilisation.Unmarshal Opération
Noter que lors de votre maréchal opération vous avez besoin d'envelopper votre instance de
MyQueryComplexType
dans unJAXBElement
? C'est parce queMyQueryComplexType
n'a pas été annotés avec@XmlRootElement
et l'élément racine informations nécessaires pour venir de laJAXBElement
. Cela signifie que lorsque vous ne l'unmarshal opération, vous obtiendrez unJAXBElement
.Pas:
Pour Plus D'Informations
Vous pourriez +100. Vous pouvez donner des primes après le fait.
OriginalL'auteur Blaise Doughan