自定义Java包:JAXB wsimport

7
我想使用maven和jaxb从一个包含2个模式和一些具有相同名称的元素的wsdl文件生成客户端。在尝试执行编译时,我遇到了以下错误:
Two declarations cause a collision in the ObjectFactory class.

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>

我尝试重新命名产生错误的元素,但是这样一来,我的Spring客户端就可以接收到正确的SOAP消息,但它无法正确地填充响应对象(所有属性都为null)。我猜问题可能来自于重命名响应类,所以我正在尝试生成不同的包,保留所有类的原始名称。

为了做到这一点,我编写了下面的bindings文件,但我不知道哪里出了问题导致其无法工作。

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>  

以下是我的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>

当我使用这些绑定文件进行编译时,仍然出现相同的错误。所以我认为可能不正确。
你发现了错误吗?
谢谢。

小提示:如果您将所有绑定文件放在src/jaxws中,则可以完全删除“bindingFiles”配置部分!然后,jaxws-maven-plugin会自动捡起它们。 - headcr4sh
1个回答

10

根据我的经验,最好创建两个绑定文件(每个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>

1
非常感谢!这解决了问题。重要提示!第一次编译插件时,由于它使用了来自我的pom文件的先前配置,所以它忽略了我的新包配置。一旦我删除了<packageName>original.package</packageName>,它就创建了不同的包。然而...Spring没有正确填充我的响应对象,我可以在我的日志记录器中看到响应SOAP消息是正确的,因此这个解决方案并没有解决我的主要问题。 - maqjav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接