Привязка — JAXB: XJC не создает класс Enum для атрибута

У меня есть проблема с инструментом XJC, который не создает класс Enum для атрибута myEnum, используя эту схему.

<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> 

person n.fibonacci    schedule 05.04.2012    source источник


Ответы (1)


Вы можете попробовать это: определить небольшой файл 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>
person Patrice M.    schedule 05.04.2012
comment
Спасибо за ваш ответ, но проблема в том, что мне нужно работать с файлом xsd (уже существующим) с более чем 1500 строками. - person n.fibonacci; 06.04.2012
comment
Вы говорите, что не можете изменить XSD (и поэтому ищете решение только для XJC)? В противном случае, не могли бы вы объяснить, почему размер имеет значение в этом случае? Кроме того, я бы порекомендовал вам предоставить подробную информацию о вашей конкретной настройке: JDK и версия JAXB + реализация, в частности. - person Patrice M.; 06.04.2012
comment
Да, я не могу изменить XSD (XSD от другого поставщика). Я использую JDK 6 и JAXB 2.2, я пытаюсь автоматически генерировать xml-файлы (заполненные случайными данными) из xsd-файлов. благодарю вас - person n.fibonacci; 06.04.2012