使用JAXWS插件从WSDL生成实现通用接口的Java类遇问题求助
我有包含如下类型的WSDL文件:
<xs:complexType name="someName"> .... </xs:complexType> <xs:complexType name="someOtherName"> .... </xs:complexType>
希望这些类型能实现通用接口:
public interface Test { //methods that already exist in the types }
为实现该目标,我创建了绑定文件:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <jaxws:bindings xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance" jaxb:extensionBindingPrefixes="xjc inheritance" xmlns:xs="http://www.w3.org/2001/XMLSchema" wsdlLocation="my_wsdl.wsdl"> <enableWrapperStyle>true</enableWrapperStyle> <enableAsyncMapping>false</enableAsyncMapping> <jaxws:bindings node="//xs:complexType[@name='someName']"> <inheritance:implements>com.mycompany.package.Test</inheritance:implements> </jaxws:bindings> </jaxws:bindings>
同时配置了Maven插件:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>jaxws-maven-plugin</artifactId> <version>${jaxws-maven-plugin.version}</version> <dependencies> <dependency> <groupId>org.jvnet.jaxb2_commons</groupId> <artifactId>jaxb2-basics</artifactId> <version>0.6.4</version> </dependency> </dependencies> <executions> <execution> <id>wsdl</id> <goals> <goal>wsimport</goal> </goals> <configuration> <xjcArgs> <xjcArg>-Xinheritance</xjcArg> <xjcArg>-Xequals</xjcArg> <xjcArg>-XtoString</xjcArg> </xjcArgs> <genJWS>true</genJWS> <bindingDirectory>${basedir}/src/main/resources/soap</bindingDirectory> <bindingFiles> <bindingFile>binding.xjb</bindingFile> </bindingFiles> <xnocompile>true</xnocompile> <xdebug>true</xdebug> <verbose>true</verbose> <wsdlUrls> <wsdlUrl>${project.basedir}/src/main/resources/soap/my_wsdl.wsdl</wsdlUrl> </wsdlUrls> <sourceDestDir>target/generated-sources/soap</sourceDestDir> </configuration> </execution> </executions> <extensions>true</extensions> </plugin>
其中-Xequals和-XtoString已生效,生成的类签名为:
public class SomeName implements ToString, Equals{...}
但-Xinheritance选项虽被识别(未添加jaxb2-basics依赖时会报错未知选项),却未对代码生成产生效果。绑定文件的XPath是正确的,且绑定已生效——例如将<inheritance:implements>替换为<jaxb:class name="changedName"/>时,类名会被修改,但仍不会实现所需接口。请问问题出在哪里?
1. 绑定文件的节点层级错误
当前绑定直接用jaxws:bindings定位xs:complexType,但jaxws:bindings的上下文是WSDL整体,而xs:complexType属于WSDL的wsdl:types下的XML Schema部分,正确的做法是先定位到Schema节点,再用jaxb:bindings来绑定类型:
修改绑定文件如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <jaxws:bindings xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance" jaxb:extensionBindingPrefixes="inheritance" xmlns:xs="http://www.w3.org/2001/XMLSchema" wsdlLocation="my_wsdl.wsdl"> <enableWrapperStyle>true</enableWrapperStyle> <enableAsyncMapping>false</enableAsyncMapping> <!-- 先定位到WSDL中的Schema节点 --> <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema"> <!-- 再绑定具体的complexType --> <jaxb:bindings node="//xs:complexType[@name='someName']"> <inheritance:implements>com.mycompany.package.Test</inheritance:implements> </jaxb:bindings> <jaxb:bindings node="//xs:complexType[@name='someOtherName']"> <inheritance:implements>com.mycompany.package.Test</inheritance:implements> </jaxb:bindings> </jaxws:bindings> </jaxws:bindings>
注意:移除了extensionBindingPrefixes中的xjc,因为它不属于绑定前缀;同时将类型绑定放在jaxb:bindings下,确保JAXB扩展能正确识别。
2. jaxb2-basics版本过旧
你使用的0.6.4版本较老,部分兼容性可能有问题,建议升级到稳定版本(比如0.11.1),修改Maven依赖:
<dependency> <groupId>org.jvnet.jaxb2_commons</groupId> <artifactId>jaxb2-basics</artifactId> <version>0.11.1</version> </dependency>
3. 重新执行生成命令
确保jaxws-maven-plugin的extensions=true已开启,当前你的插件配置这部分没问题,升级依赖后执行mvn clean generate-sources即可生效。
内容的提问来源于stack exchange,提问作者Blomex

