自定义Java包JAXB wsimport

maq*_*jav 5 java wsdl spring-ws jaxb maven

我正在尝试从wsdl文件生成一个带有maven和jaxb的客户端,里面有两个模式,一些具有相同名称的元素来自不同的模式

当我尝试执行编译时,我收到下一个错误:

Two declarations cause a collision in the ObjectFactory class.
Run Code Online (Sandbox Code Playgroud)

WSDL模式:

<wsdl:types>
    <schema targetNamespace="http://ws.services" xmlns="http://www.w3.org/2001/XMLSchema">...</schema>
    <schema targetNamespace="http://ws.models" xmlns="http://www.w3.org/2001/XMLSchema">...</schema>
</wsdl:types>
Run Code Online (Sandbox Code Playgroud)

我尝试重命名产生错误的元素,但然后我的spring客户端收到正确的SOAP消息,但它没有正确填充响应对象(它的所有属性都为null).我想问题可能来自重命名响应类,所以这就是为什么我试图生成不同的包保留所有类的原始名称.

为了做到这一点,我编写了下一个绑定文件,但我不知道我做错了它不能正常工作.

bindings.xml文件:

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

<jaxb:bindings schemaLocation="mywsdl.wsdl#types?schema1"
    node="/xs:schema[@targetNamespace='http://ws.services']">  
        <jaxb:schemaBindings>  
            <jaxb:package name="package1" />  
        </jaxb:schemaBindings>  
</jaxb:bindings>  

<jaxb:bindings schemaLocation="mywsdl.wsdl#types?schema2"
    node="/xs:schema[@targetNamespace='http://ws.models']">  
        <jaxb:schemaBindings>  
            <jaxb:package name="package2" />  
        </jaxb:schemaBindings>  
</jaxb:bindings> 

</jaxb:bindings>  
Run Code Online (Sandbox Code Playgroud)

maven文件中的配置部分是下一个,以防它有用:

<groupId>org.jvnet.jax-ws-commons</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.3</version>
<executions>
    <execution>
        <goals>
            <goal>wsimport</goal>
        </goals>
    </execution>
</executions>
<configuration>
    <wsdlLocation>wsdl/mywsdl.wsdl</wsdlLocation>
    <wsdlDirectory>src/main/resources/wsdl</wsdlDirectory>
    <wsdlFiles>
        <wsdlFile>mywsdl.wsdl</wsdlFile>
    </wsdlFiles>
    <bindingDirectory>src/main/resources/wsdl</bindingDirectory>
    <bindingFiles>
        <bindingFile>bindings.xml</bindingFile>
    </bindingFiles>
    <packageName>original.package</packageName>
    <sourceDestDir>${basedir}/src/main/java</sourceDestDir>
</configuration>
Run Code Online (Sandbox Code Playgroud)

当我使用此绑定文件进行编译时,会出现相同的错误.所以我想也许这是不对的.

你发现任何错误吗?

谢谢.

小智 8

根据我的经验,最好创建2个绑定文件(每个WSDL文件一个).相应地更新你的pom.xml并确保绑定文件的根元素是jaxws:bindings(而不是jaxb:bindings!)

一些提示:

  1. 确保正确设置"wsdlLocation"属性!它必须使用相对路径指向WSDL文件!
  2. jaxws:package确定将用于生成的服务类的包.(用@WebService注释的东西)
  3. 根据需要启用或禁用wrapperStyle和asyncMapping.;-)

"package1"的示例绑定文件:

<?xml version="1.0" encoding="UTF-8"?>

    <jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
                    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
                    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
                    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
                    xmlns:xs="http://www.w3.org/2001/XMLSchema"
                    wsdlLocation="mywsdl.wsdl"
                    version="2.0">

        <jaxws:package name="package1"/>
        <jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle>
        <jaxws:enableAsyncMapping>true</jaxws:enableAsyncMapping>

        <jaxws:bindings node="//wsdl:definitions/wsdl:types/xs:schema[@targetNamespace='http://ws.services']">
            <jaxb:schemaBindings>
                <jaxb:package name="package1"/>
            </jaxb:schemaBindings>
        </jaxws:bindings>

    </jaxws:bindings>
Run Code Online (Sandbox Code Playgroud)