【问题标题】:Customizing Java packages JAXB wsimport自定义 Java 包 JAXB wsimport
【发布时间】:2014-09-19 11:10:32
【问题描述】:

我正在尝试从一个 wsdl 文件中生成一个带有 maven 和 jaxb 的客户端,其中包含 2 个模式和一些来自不同模式的同名元素

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

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.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 自动拾取。

标签: java maven jaxb wsdl spring-ws


【解决方案1】:

根据我的经验,最好创建 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>

【讨论】:

  • 非常感谢!成功了。重要!当我第一次编译时,插件忽略了我的新包配置,因为它使用了我的 pom 文件中的前一个配置,一旦我删除了&lt;packageName&gt;original.package&lt;/packageName&gt;,它就会创建不同的包。但是...... Spring 没有正确填充我的响应对象,我可以在我的记录器中看到响应 SOAP 消息是正确的,所以这个解决方案没有解决我的主要问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
相关资源
最近更新 更多