wsimport用于枚举的JAXB类

时间:2014-04-05 05:11:15

标签: java jaxb xsd wsdl wsimport

我有一个带有嵌入式Schema的WSDL,其中包含一些simpleType枚举限制:

<element name="employeeId">
    <simpleType>
        <restriction base="string">
            <maxLength value="2"/>
            <enumeration value="EL"/>
        </restriction>
    </simpleType>
</element>

(是的,我知道该示例只有一个枚举值。) 在一些早期的特定于供应商的工具中,这些工具正在生成Java枚举,但在我目前的wsimport(JAX-WS RI 2.2.4-b01)中,它们不是。

我做了很多搜索,找到了很多关于自定义映射的讨论。我可能不愿意手动映射个别课程。值,所以我试图找到一些工作语法来全局完成。

然而,我的大部分阅读似乎表明默认应该是创建这些枚举: https://jaxb.java.net/tutorial/section_2_2_9-Defining-an-Enumeration.html#Defining%20an%20Enumeration

如果您不想要它们,则必须明确禁用它们。例如https://jaxb.java.net/nonav/2.2.5-5/docs/ch03.html#compiling-xml-schema-avoid-strong-databinding

这应该是正确的吗?如果是这样,任何想法都没有发生?

其他问题,是否应该使用xsd:token生成枚举,或仅使用xsd:string生成枚举?

1 个答案:

答案 0 :(得分:1)

据我所知,没有全球或一般的解决方案或设置。您需要一个绑定的自定义文件。 有一个单独的模式,类似于这个文件的工作对我来说:

<?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="your_schema_name.xsd" node="/xs:schema">

   <jaxb:bindings node="//xs:element[@name='employeeId']/xs:simpleType">
     <jaxb:typesafeEnumClass name="employeeId" />
   </jaxb:bindings>

   </jaxb:bindings>
</jaxb:bindings>

运行wsimport时,使用-b开关使其使用绑定自定义(wsimport -b filename ...)。

如果您在wsdl中嵌入了架构,请尝试此绑定自定义:

<?xml version="1.0" encoding="UTF-8"?>
<jaxws:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
           xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
           jaxb:version="2.0"
           wsdlLocation="your_wsdl_name.wsdl">

   <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema/xs:element[@name='employeeId']/xs:simpleType">
     <jaxb:typesafeEnumClass name="someElement" />
   </jaxws:bindings>

</jaxws:bindings>

我也尝试将其作为外部文件(wsimport -b filename.xjb ...)。 注意:我必须使用jaxws:bindings而不是jaxb:bindings才能使XPath解析正常工作。但是,jaxb:typesafeEnumClass仍然在jaxb命名空间中。