Почему JAXB 2.0 с jdk1.5 не может распознать строковые перечисления, которые начинаются с цифры? - PullRequest
2 голосов
/ 20 марта 2009

Ниже приведен пример схемы, которую я использовал для генерации классов 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 Ответ

3 голосов
/ 22 марта 2009

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