Варианты JAXBContext.newInstance

Я экспериментирую с различными формамиnewInstance метод в классеJAXBContext (Я использую стандартную реализацию Sun JAXB, которая поставляется с Oracle JDK 1.7).

Мне не ясно, когда можно просто перейти кnewInstance Метод конкретных классов по сравнению сObjectFactory класс. Должен отметить, что я использую JAXB исключительно для анализа XML-файлов, то есть только в направлении XML-> Java.

Вот абсолютно минимальный код, который демонстрирует мою точку зрения:

файл 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>

Учитывая вышеизложенное XSD, следующееJAXBInstance.newInstance вызовы успешно создают контекст, который может анализировать образецa.xml файл:

jc = JAXBContext.newInstance ("example.a");jc = JAXBContext.newInstance (example.a.ObjectFactory.class);jc = JAXBContext.newInstance (example.a.RootType.class, example.a.ObjectFactory.class);

Тем не менее, передаваяexample.a.RootType.class один терпит неудачу сjavax.xml.bind.UnmarshalException во время выполнения:

jc = JAXBContext.newInstance(example.a.RootType.class); // this fails at runtime.

Кто-нибудь может пролить свет? Причина, по которой я экспериментирую с этимиJAXBContext :: newInstance Вариации в том, что я наткнулся наЭта проблема где принятый ответ включал опцию «построения контекста JAXB на основе отдельных классов, а не объектных фабрик». Примерa.xml иJAXB Я использую код Java, следуйте в конце поста.

образец a.xml используется
<?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
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() );
}

Ответы на вопрос(1)

Ваш ответ на вопрос