2012-04-05 4 views
2

У меня возникла проблема с инструментом XJC, что он не генерирует класс Enum для атрибута myEnum, используя эту схему.Binding - JAXB: XJC Не генерирует класс Enum для атрибута

<xs:element name="myClass"> 
<xs:complexType> 
    <xs:attribute name="myEnum" > 
      <xs:simpleType > 
       <xs:restriction base="xs:string"> 
        <xs:maxLength value="1"/> 
        <xs:enumeration value="C"/> 
        <xs:enumeration value="M"/> 
        <xs:enumeration value="S"/> 
       </xs:restriction> 
      </xs:simpleType> 
    </xs:attribute> 
</xs:complexType> 
</xs:element> 

но он генерирует, если я использую только этот

<xs:simpleType > 
<xs:restriction base="xs:string"> 
    <xs:maxLength value="1"/> 
    <xs:enumeration value="C"/> 
    <xs:enumeration value="M"/> 
    <xs:enumeration value="S"/> 
</xs:restriction> 
</xs:simpleType> 

здесь является внешним связыванием содержимого файла:

<?xml version="1.0" encoding="UTF-8" ?> 
<bindings xmlns="http://java.sun.com/xml/ns/jaxb" 
    version="2.1" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    > 
<globalBindings typesafeEnumMemberName="generateName"> 

</globalBindings> 
</bindings> 

ответ

2

Вы можете попробовать это: определить небольшой XSD файл только этот конкретный тип, объявленный как глобальный тип, например:

<xs:simpleType name="myEnumSimpleType"> 
    <xs:restriction base="xs:string"> 
     <xs:maxLength value="1"/> 
     <xs:enumeration value="C"/> 
     <xs:enumeration value="M"/> 
     <xs:enumeration value="S"/> 
    </xs:restriction> 
</xs:simpleType> 

<xs:element name="myClass"> 
    <xs:complexType> 
     <xs:attribute name="myEnum" type="myEnumSimpleType"> 
    </xs:complexType> 
</xs:element> 

Это создаст класс JAXB (назовем его «искусственным классом JAXB»).

Затем вы можете запустить xjc на большом XSD и настроить генерацию, чтобы использовать этот тип для определенных элементов.

В качестве альтернативы, если генерация JAXB из этого внешнего XSD является одноразовой (а затем вы помещаете JAXB-сгенерированный код в SVN/Git, например), вы можете переписать это зелье кода для использования вместо этого используется ваш «искусственный» тип JAXB.

Еще вы можете попробовать, чтобы ваше связывание настройки

<globalBindings typesafeEnumMemberName="generateName"> 

не может быть глобальной, но и использовать выражение, чтобы попытаться пригвоздить его именно на этом типе. Вероятно, JAXB создаст новый класс для каждого события, хотя они будут одинаковыми.

Поскольку я нахожу xpath утомительным, я бы быстро протестировал его на локальной копии этого большого XSD, который вы модифицируете с помощью пространства имен, например.

<xs:element name="myClass"> 
    <xs:complexType> 
    <xs:attribute name="myEnum" > 
     <xs:simpleType > 
       <xs:annotation> 
        <xs:appinfo> 
         <jaxb:typesafeEnumClass/> 
        </xs:appinfo> 
       </xs:annotation>    <xs:restriction base="xs:string"> 
       <xs:maxLength value="1"/> 
       <xs:enumeration value="C"/> 
       <xs:enumeration value="M"/> 
       <xs:enumeration value="S"/> 
      </xs:restriction> 
     </xs:simpleType> 
    </xs:attribute> 
    </xs:complexType> 
</xs:element> 
+0

Thaank Вас за ответ, но проблема в том, что я должен работать на файл XSD (уже существует) с более чем 1500 строк –

+0

Вы говорите, вы не можете изменить XSD (и, следовательно, ищут XJC-единственное решение)? В противном случае, пожалуйста, объясните, почему размер имеет значение в этом случае? Кроме того, я бы рекомендовал вам подробно рассказать о вашей конкретной настройке: в частности, JDK и JAXB version +. –

+1

Да Я не могу изменить XSD (XSD от другого поставщика) Я использую JDK 6 и JAXB 2.2, я пытаюсь генерировать автоматически xml-файлы (заполненные случайными данными) из xsd-файлов. Спасибо –

Смежные вопросы