JAXB: Unmarshalling не всегда заполняет определенные классы? - PullRequest
4 голосов
/ 22 февраля 2010

У меня проблема с генерацией класса JAXB, с которой я надеялся получить помощь. Вот часть XML, которая является источником моей проблемы ...

<xs:complexType name="IDType"> 
<xs:choice minOccurs="0" maxOccurs="2"> 
  <xs:element name="DriversLicense"    minOccurs="0" maxOccurs="1" type="an..35" /> 
    <xs:element name="SSN"        minOccurs="0" maxOccurs="1" type="an..35" /> 
    <xs:element name="CompanyID"       minOccurs="0" maxOccurs="1" type="an..35" /> 
  </xs:choice> 
</xs:complexType> 
<xs:simpleType name="an..35"> 
  <xs:restriction base="an"> 
    <xs:maxLength value="35" /> 
  </xs:restriction> 
</xs:simpleType> 

<xs:simpleType name="an"> 
   <xs:restriction base="xs:string"> 
     <xs:pattern value="[ !-~]*" /> 
   </xs:restriction> 
</xs:simpleType>

... теперь это сгенерирует JAXBElement типов из-за choice с maxOccurs > 1. Я хочу избежать этого, поэтому я сделал это, изменив код для использования элемента «Обертка» и переместив maxOccurs вверх в тег последовательности следующим образом ...

<xs:complexType name="IDType"> 
<xs:sequence maxOccurs="2"> 
  <xs:element name=Wrapper>
  <xs:complexType>
  <xs:choice> 
  <xs:element name="DriversLicense"    minOccurs="0" maxOccurs="1" type="an..35" /> 
    <xs:element name="SSN"        minOccurs="0" maxOccurs="1" type="an..35" /> 
    <xs:element name="CompanyID"       minOccurs="0" maxOccurs="1" type="an..35" /> 
  </xs:choice>
  </xs:complexType>
  </xs:element>
</xs:sequence> 
</xs:complexType>

<xs:simpleType name="an..35"> 
  <xs:restriction base="an"> 
    <xs:maxLength value="35" /> 
  </xs:restriction> 
</xs:simpleType> 

<xs:simpleType name="an"> 
   <xs:restriction base="xs:string"> 
     <xs:pattern value="[ !-~]*" /> 
   </xs:restriction> 
</xs:simpleType> 

Для генерации классов, похоже, он отлично работает - элемент JAXB заменяется списком упаковщиков как String (т.е. List<IDType.Wrapper<String>) и прекрасно компилируется.

Однако, когда я отменяю фактические данные XML в сгенерированных классах, данные в классе-обертке не заполняются - однако JAXB не выдает исключение.

Мой вопрос: Нужно ли мне изменить схему другим способом, чтобы эта работа работала? Или я могу добавить / изменить / удалить сгенерированный код или аннотации?

1 Ответ

3 голосов
/ 22 февраля 2010

Неплохая идея, но обратите внимание на следующее: согласно вашей схеме, совершенно законно, что ваш элемент "Обертка" не имеет содержимого. Содержит выбор дополнительных предметов.

Во-вторых, у вас может не быть проверки схемы; тогда JAXB не будет жаловаться, если ваши документы сломаны. Если вы хотите включить проверку схемы, получите Unmarshaller и выполните инициализацию следующим образом:

 unmarshaller.setValidating(true);
 SchemaFactory sf = SchemaFactory.newInstance(
    javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI);
 Schema schema = sf.newSchema(new File("my-schema.xsd"));
 unmarshaller.setSchema(schema);
...