JAXBContext.newInstance variations
Je suis expérimenter avec les différentes formes de newInstance méthode dans la classe JAXBContext (je suis en utilisant la valeur par défaut Soleil JAXB mise en œuvre fourni avec Oracle JDK 1.7).
Il n'est pas clair pour moi quand c'est ok pour juste passer le newInstance méthode les classes concrètes par rapport à la ObjectFactory classe. Je dois souligner que je suis en utilisant JAXB purement pour analyser des fichiers XML, c'est à dire uniquement dans le XML->Java direction.
Voici le absolument un minimum de code qui illustre mon propos:
fichier xsd
<?xml version="1.0" encoding="UTF-8"?>
<schema elementFormDefault="qualified"
xmlns ="http://www.w3.org/2001/XMLSchema"
xmlns:a ="http://www.example.org/A"
targetNamespace="http://www.example.org/A">
<element name="root" type="a:RootType"></element>
<complexType name="RootType">
<sequence>
<element name="value" type="string"></element>
</sequence>
</complexType>
</schema>
Donné ci-dessus XSD, la suite JAXBInstance.newInstance invocations réussir à créer un contexte qui peut analyser un échantillon a.xml fichier:
- jc = JAXBContext.newInstance("exemple.un");
- jc = JAXBContext.newInstance(example.a.ObjectFactory.class);
- jc = JAXBContext.newInstance(example.a.RootType.class, example.a.ObjectFactory.class);
Cependant, le passage de la example.a.RootType.class seul échoue avec javax.xml.bind.UnmarshalException au moment de l'exécution:
jc = JAXBContext.newInstance(example.a.RootType.class); //this fails at runtime.
Quelqu'un peut jeter un peu de lumière? La raison pour laquelle je suis expérimenter sur ces JAXBContext::newInstance variations, c'est que j'ai trébuché sur ce problème où l'on a accepté de répondre à l'option de la "création de la JAXB contexte sur la base des différentes classes plutôt que de l'objet usines". L'échantillon a.xml et la JAXB code Java, je suis en utilisant suivre à la fin du post.
échantillon a.xml utilisé
<?xml version="1.0" encoding="UTF-8"?>
<a:root xmlns:a="http://www.example.org/A"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/A A.xsd">
<a:value>foo</a:value>
</a:root>
JAXB le code d'analyse de
public static void main (String args[]) throws JAXBException, FileNotFoundException {
JAXBContext jc = null;
message("using package context (press any key:)");
jc = JAXBContext.newInstance("example.a");
work(jc); //SUCCEEDS
message("using Object factory (press any key):");
jc = JAXBContext.newInstance(example.a.ObjectFactory.class);
work(jc); //SUCCEEDS
message("using class enumeration (press any key):");
try {
jc = JAXBContext.newInstance(example.a.RootType.class);
work(jc); //FAILS
} catch (javax.xml.bind.UnmarshalException e) {
e.printStackTrace();
}
message("using class enumeration and Object factory too (press any key):");
jc = JAXBContext.newInstance(example.a.RootType.class, example.a.ObjectFactory.class);
work(jc); //SUCCEEDS
}
private static void work(JAXBContext jc) throws JAXBException, FileNotFoundException {
Unmarshaller u = jc.createUnmarshaller();
RootType root = ((JAXBElement<RootType>)u.unmarshal( new FileInputStream( "a.xml" ))).getValue();
System.out.println( root.getValue() );
}
OriginalL'auteur Marcus Junius Brutus | 2013-05-31
Vous devez vous connecter pour publier un commentaire.
JAXB Modèle Généré à partir de schémas XML
Lors de la création d'un
JAXBContext
à partir d'un modèle généré à partir d'un schéma XML je recommande toujours de le faire sur le nom du package des classes générées.Il est même préférable d'utiliser un
newInstance
méthode qui prend unClassLoader
paramètre. Cela vous fera économiser de chagrin lorsque vous vous déplacez d'un Java SE, Java EE environnement.Lorsque vous créez le
JAXBContext
sur le nom du paquet, le JAXB impl suppose que vous avez généré le modèle à partir d'un schéma XML et tire dans leObjectFactory
la classe puisqu'il génère toujours la classe annotée avec@XmlRegistry
avec ce nom.À partir d'un Modèle Java
C'est quand j'ai recommandons l'utilisation de la
newInstance
méthodes que de prendre des cours. Lors de l'initialisation d'unJAXBContext
de JAXB classes il n'y a rien de spécial à propos d'une classe appeléeObjectFactory
. Le rôle de laObjectFactory
pourrait être joué par n'importe quelle classe annotée avec@XmlRegistry
de sorte qu'il n'est pas automatiquement recherchées. C'est pourquoi votre cas d'utilisation travaillé lorsque vous explicitement référenceObjectFactory
et a échoué lorsque vous n'avez pas.OriginalL'auteur Blaise Doughan