2014-09-19 61 views
5

我试图生成一个与里面2种模式和不同方案自定义的Java包JAXB wsimport的

具有相同名称的一些元素WSDL文件Maven和JAXB客户端当我尝试执行我编译“M得到一个错误:

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> 

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

为了做到这一点,我写了下一个绑定文件,但我不知道我在做什么错误,它不工作。

bindings.xml文件:在Maven文件

<?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> 

我的配置部分是下一个,以防万一它是有用的:

<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> 

当我编译这个绑定文件,同样的错误出现。所以我认为这可能是不对的。

你有没有发现任何错误?

谢谢。

+0

只是一个提示:您可以删除“bindingFiles”配置部分完全如果你把在SRC/JAXWS所有绑定文件!然后它们会被jaxws-maven插件自动拾取。 – headcr4sh 2014-09-19 11:33:25

回答

7

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

一些提示:

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

示例“包1”绑定文件:

<?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文件中的前一个包,一旦我删除了' original.package它创建了不同的包。然而...Spring没有正确地填充我的响应对象,并且我可以在记录器中看到响应SOAP消息是正确的,所以此解决方案并未解决我的主要问题。 – maqjav 2014-09-22 05:52:22