Сгенерированный Jaxb класс использовал JAXBElement вместо указанного типа - PullRequest
9 голосов
/ 02 декабря 2010

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

У меня есть xsd с двумя определениями элементов

<xs:complexType name="elementA">
   <xs:sequence>
      <xs:element name="date" type="xs:string" minOccurs="0"/>
      <xs:element name="lastXdigits" type="xs:string" nillable="true" minOccurs="0"/>
   </xs:sequence>
</xs:complexType>

Это генерирует:

protected String date;
@XmlElementRef(name = "lastXdigits", namespace = "http://xxxxxxx", type = JAXBElement.class)
protected JAXBElement<String> lastXDigits;

Изменение xsd на:

<xs:element name="lastXdigits" type="xs:string" nillable="true" minOccurs="1"/>

Результат:

protected String date;
@XmlElement(name = "lastXdigits", required = true, nillable = true)
protected String lastXDigits;

и использование:

<xs:element name="lastXdigits" type="xs:string" minOccurs="0"/>

Результат:

protected String date;
@XmlElement(name = "lastXdigits")
protected String lastXDigits;

Это кажется мне очень странным. Почему lastXDigits генерируется как тип JAXBElement в первом случае и почему тип String не подходит во всех случаях? Кроме того, почему jaxb должен относиться к этим двум элементам по-разному, если их определения, кроме имени, идентичны?

Я использую задачу муравья jaxb-xjc из jaxb 2.0.5.

Выглядит ли это подозрительно или есть хорошее обоснование этих различий?

1 Ответ

8 голосов
/ 02 декабря 2010

Если nillable="true" вместе с minOccurs="0", невозможно представить значения просто с помощью String.Что бы null значило бы?Означает ли это, что оно было нулевым или произошло 0 раз?Но я полагаю, что это несколько спорный вопрос, когда речь идет только о строке.

Сравните с пустым списком.Нулевой список, безусловно, отличается от пустого.

...