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