【问题标题】:wsimport JAXB classes for enumerationswsimport 用于枚举的 JAXB 类
【发布时间】:2014-04-05 05:11:14
【问题描述】:

我有一个带有嵌入式架构的 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 一起发生?

【问题讨论】:

  • 遇到类似问题,不介意这个问题得到一些 TLC。
  • 我也遇到了同样的问题! Apache XMLBeans 按预期工作(生成枚举),但 JAX-WS 2 不行!见:stackoverflow.com/questions/4235074/…
  • 奇怪的是,我认为我的一些枚举正在生成枚举,但不是这个。还没有尝试看看它们之间有什么不同。在这两种情况下都没有自定义设置或映射。

标签: java jaxb xsd wsdl wsimport


【解决方案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 文件名 ...)。

如果您在 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 命名空间中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    • 2015-09-02
    • 2012-07-01
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多