【问题标题】:JAXB: Anonymous simple types as enums?JAXB:匿名简单类型作为枚举?
【发布时间】:2009-02-25 14:41:51
【问题描述】:

当通过 XJC 编译器从 XSD 生成 Java 时,对于具有匿名 simpleTypes 的元素,我总是得到 java.lang.String 类型,如下所示:

    <xsd:element name="Product">
    <xsd:simpleType>
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="Product1"/>
            <xsd:enumeration value="Product2"/>
            <xsd:enumeration value="Product3"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:element>

当然,我想要一个枚举。有没有办法诱使 XJC 生成和使用一个?

我们使用的是 JAXB 2.1.3。 注意:在您问之前,不,我无法更改架构并使其适应 XJC 的错误。

【问题讨论】:

    标签: binding xsd jaxb


    【解决方案1】:

    你必须放入你的 XJC 文件:

    <jxb:bindings node="//xsd:element[@name='Product']/xsd:simpleType">
        <jxb:typesafeEnumClass name="ProductType" />
    </jxb:bindings>
    

    <jxb:bindings node="//xsd:element[@name='Produkt']">
        <jxb:bindings node="./xsd:simpleType">
            <jxb:typesafeEnumClass name="ProduktType" />
        </jxb:bindings>
    </jxb:bindings>
    

    【讨论】:

      【解决方案2】:

      这是我如何实现此功能的示例。为了完整起见,我将添加整个 xjb,因为我承认查看现有示例我仍然觉得它有点令人困惑。

      这是 .xjb 文件

      <?xml version="1.0" encoding="UTF-8"?>
      <jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
                     xmlns:xs="http://www.w3.org/2001/XMLSchema"
                     jaxb:version="1.0">
         <jaxb:bindings schemaLocation="search-constraints.xsd" 
          node="/xs:schema">
      
           <jaxb:bindings node="//xs:simpleType[@name='booleanStringType']">
            <jaxb:typesafeEnumClass name="BooleanStringType" />
        </jaxb:bindings>
      
         </jaxb:bindings>
      </jaxb:bindings>
      

      在这里,绑定指的是我在 search-constraints.xsd 中的根级别声明的简单类型。这是该文件的摘录:

      <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       targetNamespace="http://www.example.com" 
       xmlns:tns="http://www.example.com" 
       elementFormDefault="qualified"
       xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
          jaxb:version="1.0">
      
      ...
      
      
      <xs:simpleType name="booleanStringType">
          <xs:restriction base="xs:string">
              <xs:enumeration value="true" />
              <xs:enumeration value="false" />
          </xs:restriction>
      </xs:simpleType>
      

      【讨论】:

        【解决方案3】:

        我有一个非常相似的问题,我在 JAXB 邮件列表中询问并得到了this fairly helpful response(虽然还没有时间尝试)

        编辑:如果您说的是自动生成枚举类,而不仅仅是自动映射到您自己编写的枚举类,我认为您可以编写一个可以解析的java类模式文件并为该枚举自动生成 java 代码。 (然后在调用 xjc 时运行该 java 类)

        【讨论】:

        • 我设法在没有定义自己的枚举类型的情况下做到了这一点 - 请参阅我的答案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多