Почему JAXB по-разному обрабатывает расширения?

1

Рассмотрим следующий файл XSD:

<xs:element name="person" type="Person"/>
<xs:element name="teacher" type="Teacher"/>

<xs:complexType name="Person">
    <xs:sequence>
       <xs:element name="age" type="xs:int"/>
       <xs:element name="sex" type="xs:string"/>
       <xs:element name="fullname" type="xs:string"/>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="Teacher">
    <xs:complexContent>
        <xs:extension base="Person">
            <xs:sequence>
                <xs:element name="school" type="xs:string"/>
                <xs:element name="grade" type="xs:string"/>
                <xs:element name="subject" type="xs:string"/>
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

Я использовал JAXB для создания классов Java для этих сложных типов. Странная вещь: класс Учителя был аннотирован с помощью @XmlRootElement, тогда как класса Person не было.

Кто-нибудь знает, почему это?

Теги:
jaxb
xsd

1 ответ

1

Элементы верхнего уровня с анонимными сложными типами получают на них аннотации @XmlRootElement. Элементы верхнего уровня с именованным сложным типом содержат аннотации @XmlElementDecl для сгенерированного ObjectFactory. Teacher не следует создавать с помощью @XmlRootElement если не используется какая-либо привязка к привязке.

Чтобы получить больше информации

Я больше об этом расскажу в своем блоге:

  • 0
    Ах, хорошая мысль. Я изменил свой код для включения двухэлементных объявлений, которые я пропустил. Я думаю, это объясняет, почему Учитель аннотирован XmlRootElement. Но это все еще не объясняет, почему Person не аннотирован XmlRootElement.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню