JAXB: Unmarshalling не всегда заполняет определенные классы?

У меня проблема с генерацией класса 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 не генерирует исключение.

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


person user278458    schedule 22.02.2010    source источник


Ответы (1)


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

Во-вторых, у вас может не быть включена проверка схемы; тогда 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);
person xcut    schedule 22.02.2010
comment
Спасибо за быстрый ответ. Я признателен за это. Да, у меня есть валидатор, и именно там я его поймал, как вы и сказали. Однако в режиме отладки, после десортировки XML, который имел два экземпляра, если оболочка IDType (т.е. DriversLicense и SSN в данном случае), я посмотрел на классы и заметил, что они действительно не заселен. Таким образом, даже несмотря на то, что класс Wrapper был сгенерирован, рассортировка по-прежнему не удалась, хотя этого не должно было произойти. У вас есть идеи, почему? Любые предложения по изменению настроек XML или любых привязок? Спасибо еще раз! - person user278458; 23.02.2010