Почему 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> 
Другие вопросы по тегам