Маршаллер JAXB, использующий соглашение о переменных-членах Java - PullRequest
2 голосов
/ 08 июня 2011

В настоящее время я пытаюсь выяснить, почему маршаллер JAXB использует соглашение о переменных-членах Java, а не аннотацию XmlType.

Вот ситуация:

  • Сторонние дали нам XSD
  • Мы используем инструменты JDK для генерации классов Java
  • Сгенерированные классы Java создали правильную аннотацию: @XmlType (name = "XML_DOCUMENT_TYPE")

Но когда я попытался преобразовать класс обратно в XML, JAXB преобразует его в <xmlDocumentType> вместо <XML_DOCUMENT_TYPE>

Есть идеи, почему? (Если так, как я могу это исправить?)

Обновление: для уточнения проблема возникла в элементе верхнего / корневого уровня, а не в переменной sub element / member.

1 Ответ

4 голосов
/ 08 июня 2011

ОБНОВЛЕНИЕ (на основе комментария xandross

Вы можете использовать @XmlRootElement для управления именем корневого элемента:

@XmlRootElement(name="XML_DOCUMENT_TYPE")
public class Foo {
  ...
}

В качестве альтернативы вы можете обернуть кореньобъект в экземпляре JAXBElement для предоставления информации о корневом элементе.

ОБНОВЛЕНИЕ (на основе комментария Мохамеда Мансура)

В JAXB классы соответствуют типам XML, а поля / свойства соответствуют атрибутам / элементам XML.Это имеет смысл, если учесть, что может существовать тип адреса:

<xs:complexType name="address">
    <xs:sequence>
        <xs:element name="street" type="xs:string"/>
    </xs:sequence>
</xs:complexType>

и несколько элементов (с разными именами) этого типа:

<xs:complexType name="customer">
    <xs:sequence>
        <xs:element name="billing-address type="address"/>
        <xs:element name="shipping-address type="address"/>
    </xs:sequence>
</xs:complexType>

Вы можете контролировать имяэлемента / атрибута, с которым свойство сопоставляется с аннотациями @XmlElement / @XmlAttribute:

@XmlElement(name="shipping-address")
public getShippingAddress() {
    return shippingAddress;
}

или

@XmlElement(name="ShippingAddress")
public getShippingAddress() {
    return shippingAddress;
}

Если свойство не аннотировано, оно рассматривается как@XmlElement, а имя элемента является производным от имени свойства.

...