Как использовать ObjectFactory, сгенерированный Jaxb?

Я использую Jaxb для генерации классов Java. В моей схеме определен следующий элемент:

<xs:complexType name="AutomobileType" abstract="true">
    <xs:sequence>
        <xs:element name="Color" type="core:ColorName"/>
        <xs:element name="Weight" type="core:PoundsWeightType"/>
        <xs:element name="Fuel" type="Fuel"/>
        <xs:element name="NumDoors" type="xs:nonNegativeInteger"/>
        <xs:element name="NumCylinders">
            <xs:simpleType>
                <xs:restriction base="xs:int">
                    <xs:minInclusive value="1"/>
                    <xs:maxInclusive value="12"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
    </xs:sequence>
</xs:complexType>    
<xs:element name="Automobile" type="AutomobileType"/>

Как видите, у меня есть один элемент под названием " Автомобиль".

Jaxb создает классы и ObjectFactory, которые я использую для создания экземпляров Automobile. Меня сбивает с толку метод создания экземпляра Automobile:

public JAXBElement<AutomobileType> createAutomobile(AutomobileType value)

Почему метод createAutomobile имеет аргумент? Как мне использовать этот метод?

Я попробовал следующее:

ObjectFactory objectFactory = new ObjectFactory();
objectFactory.createAutomobile(new Automobile());

но это не компилируется, потому что класс Automobile является абстрактным, и поэтому я не могу создать экземпляр.

1 ответ

Решение

Есть еще один метод:

 public AutomobileType createAutomobileType();

В JAXB конструкция xsd:complexType "AutomobileType" отображает класс с тем же именем. Предполагается, что это структура данных, которая эквивалентна этому типу схемы XML.

JAXBElement<> является (параметризованным) типом оболочки, который связывает объект java, имя элемента и пространство имен, и поэтому его конструктор принимает в качестве параметра объект конструктора AutomobileType в дополнение к пространству имен элемента и имени элемента. Сгенерированная ObjectFactory "createAutomobile(..)" - это просто удобный метод для обертывания этого конструктора, жестко запрограммировавший ваше пространство имен и имя элемента из вашей XML-схемы.

Хотя сначала эта дихотомия не совсем прямая, учтите, что у вас может быть другой элемент под другим именем

Они будут структурно эквивалентны, но имя элемента будет другим. У вас будет другой метод ObjectFactory "createMotorcycle(...)".

Вы можете создать безымянный объект automotiveType для создания содержимого элемента xml, а затем сообщить JAXB, в каком именно XML-элементе он должен быть представлен.

Я не могу рекомендовать достаточно прочитать документацию JAXB по этой теме.

Другие вопросы по тегам