如何使用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
相关产品推荐
相关产品推荐

