Почему JAXB 2.0 с jdk1.5 не может распознать строковые перечисления, которые начинаются с цифры?
Ниже приведен пример схемы, которую я использовал для создания классов JAXB. Я заметил, что когда у меня есть строковый тип с перечислениями, например, в моем случае, stepType, значения которого начинаются с цифры, JAXB не генерирует отдельный класс перечисления, скажем класс StepType. Это работает нормально, когда я использую только алфавиты для значения. Может кто-нибудь сказать, является ли это известной ошибкой, пожалуйста?
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd = "http://www.w3.org/2001/XMLSchema">
<xsd:element name="WorkoutSchedule" >
<xsd:complexType>
<xsd:sequence>
<xsd:element name="WorkoutSchedule" minOccurs = "0" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="ScheduleItem" minOccurs="1" maxOccurs="1">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Step" minOccurs="1" maxOccurs="1" type="stepType"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:simpleType name="stepType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="1stStep"></xsd:enumeration>
<xsd:enumeration value="2ndStep"></xsd:enumeration>
<xsd:enumeration value="3rdStep"></xsd:enumeration>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
1 ответ
JAXB должен создавать действительный код Java, поэтому он привязан к специфическим для Java правилам именования.
Перечисления Java должны иметь специфичные для Java имена, которые равны для классов, методов, полей,... Никакое имя не может начинаться с цифры.
Вы можете упорядочить существующие перечисления Java, используя схему JAXB в XML с пользовательскими именами, переопределив их, используя
/* some JAXB annotations go here */
enum MyEnum{
@XmlEnumValue(name="1")
ONE,
@XmlEnumValue(name="2")
TWO
}
Обратный процесс выполняется с небольшим "обходным путем":
<xsd:simpleType>
<xsd:annotation>
<xsd:appinfo>
<jxb:typesafeEnumClass name="MyEnum">
<jxb:typesafeEnumMember name="ONE" value="1"/>
<jxb:typesafeEnumMember name="TWO" value="2"/>
</jxb:typesafeEnumClass>
</xsd:appinfo>
</xsd:annotation>
<xsd:restriction base="xsd:int">
<xsd:enumeration value="1"/>
<xsd:enumeration value="2"/>
</xsd:restriction>
</xsd:simpleType>