为什么带有 jdk1.5 的 JAXB 2.0 无法识别以数字开头的字符串枚举?

发布于 2024-07-14 22:59:35 字数 1389 浏览 6 评论 0原文

以下是我用来尝试生成 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>

Following is the sample schema I used to try to generate the JAXB classes. What I noticed is that when I have a string type with enumerations, for instance, in my case the stepType, with values starting with a numeral, JAXB does not generate a separate enum class say StepType class. It works fine, when I use only alphabets for the value. Could someone tell whether this is a known bug please?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

却一份温柔 2024-07-21 22:59:35

JAXB 必须创建有效的 Java 代码,因此它必须遵守特定于 Java 的命名规则。

Java 的枚举需要具有 Java 特定的命名,这对于类、方法、字段等都是相同的。名称不允许以数字开头。

您可以使用 JAXB 将现有的 Java 枚举编组为具有自定义名称的 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> 

JAXB have to create valid Java code, so it's bound to Java-specific naming rules.

Java's enums are required to have Java-specific naming, which is equal for classes, methods, fields, ... No name is allowed to begin with a numerical digit.

You can marshal existing Java enums using JAXB to XML schema with custom names by overriding them using

/* some JAXB annotations go here */
enum MyEnum{
    @XmlEnumValue(name="1")
    ONE,
    @XmlEnumValue(name="2")
    TWO
}

The opposite process is done with a little 'workaround':

<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> 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文