You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用jaxws-maven-plugin自定义@XmlType注解

自定义JAX-WS生成的枚举类@XmlType注解(名称与命名空间)

问题背景

我使用jaxws-maven-plugin基于WSDL生成Java桩代码,其中依赖的STL_Header_v.1.2.0.xsd定义了如下枚举类型:

<xsd:simpleType name="CompletionCodes">
  <xsd:restriction base="xsd:token">
    <xsd:enumeration value="Complete"/>
    <xsd:enumeration value="Incomplete"/>
    <xsd:enumeration value="NotProcessed"/>
    <xsd:enumeration value="Unknown"/>
  </xsd:restriction>
</xsd:simpleType>

当前执行mvn clean install后生成的枚举类如下:

@XmlType( name = "CompletionCodes" )  
@XmlEnum  
public enum CompletionCodes

核心需求

需要修改生成的@XmlType注解,指定命名空间并修改名称,最终生成代码如下:

@XmlType(
    name = "VoidCompletionCodes",
    namespace = "http://services.sabre.com/STL_Header/v120"
)
@XmlEnum
public enum CompletionCodes

尝试过的无效配置

我曾尝试使用xjc:xmlType元素在binding.xjb中配置,但JAXB无法识别该声明:

<jaxb:bindings version="1.0"  
              xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"  
              xmlns:xs="http://www.w3.org/2001/XMLSchema"  
              jaxb:extensionBindingPrefixes="xjc"  
              xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc">  

  <jaxb:bindings schemaLocation="STL_Header_v.1.2.0.xsd"  
                 xmlns="http://services.sabre.com/STL_Header/v120">  
    <jaxb:schemaBindings>  
      <jaxb:package name="com.sabre.sws.header"/>  
    </jaxb:schemaBindings>  
    <jaxb:bindings node="//xs:simpleType[@name='CompletionCodes']">  
      <!-- xmlType元素无法被JAXB识别 -->
      <xjc:xmlType name="VoidCompletionCodes" namespace="http://services.sabre.com/STL_Header/v120" />  
    </jaxb:bindings>  
  </jaxb:bindings>  
</jaxb:bindings>

解决方案

1. 正确的绑定文件配置

xjc:xmlType并非标准JAXB绑定元素,针对枚举类型,需使用标准的jaxb:typesafeEnumClass结合jaxb:xmlType实现:

<jaxb:bindings version="2.1"
              xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
              xmlns:xs="http://www.w3.org/2001/XMLSchema"
              xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
              jaxb:extensionBindingPrefixes="xjc">

  <jaxb:bindings schemaLocation="STL_Header_v.1.2.0.xsd"
                 node="/xs:schema[@targetNamespace='http://services.sabre.com/STL_Header/v120']">
    <jaxb:schemaBindings>
      <jaxb:package name="com.sabre.sws.header"/>
    </jaxb:schemaBindings>

    <jaxb:bindings node="//xs:simpleType[@name='CompletionCodes']">
      <!-- 自定义枚举类的XmlType注解 -->
      <jaxb:typesafeEnumClass>
        <jaxb:xmlType name="VoidCompletionCodes" namespace="http://services.sabre.com/STL_Header/v120"/>
      </jaxb:typesafeEnumClass>
    </jaxb:bindings>
  </jaxb:bindings>
</jaxb:bindings>
  • 关键点:用jaxb:typesafeEnumClass包裹jaxb:xmlType,这是JAXB针对枚举类型的标准绑定方式
  • 确保schemaLocation和XPath节点定位准确,匹配目标XSD及对应的simpleType

2. 配置jaxws-maven-plugin确保绑定生效

在pom.xml中确保插件正确引用绑定文件,示例配置如下:

<plugin>
  <groupId>org.jvnet.jax-ws-commons</groupId>
  <artifactId>jaxws-maven-plugin</artifactId>
  <version>2.3.1</version>
  <executions>
    <execution>
      <goals>
        <goal>wsimport</goal>
      </goals>
      <configuration>
        <wsdlFiles>
          <wsdlFile>VoidTicketLLS2.1.0RQ.wsdl</wsdlFile>
        </wsdlFiles>
        <bindingFiles>
          <bindingFile>binding.xjb</bindingFile>
        </bindingFiles>
        <packageName>com.your.package</packageName>
        <sourceDestDir>${project.build.directory}/generated-sources/jaxws</sourceDestDir>
      </configuration>
    </execution>
  </executions>
</plugin>

3. 验证执行

重新执行mvn clean install,生成的枚举类将包含指定的@XmlType注解参数,符合需求。

内容的提问来源于stack exchange,提问作者Ethan Miller

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 18:07:18