6

我尝试通过给出以下命令,使用 cxf(版本 2.2.3、2.2.6 和 2.7.0)从 wsdl 生成存根和客户端

> wsdl2java.bat -p com.easynet.eordering.client -client  http://expediter.staging.gis.easynet.com:7001/cds/services/eordering?wsdl

但我收到一个错误

WSDLToJava 错误:非唯一的身体部位!在港口,操作必须在线路上具有唯一的操作签名才能成功调度。在端口 {http://eordering.uk.easynet.net}eorderingPortSOAP,操作“{http://eordering.uk.easynet.net}getAMList”和“{http://eordering.uk.easynet.net}getDCList " 具有相同的请求正文块 {http://eordering.uk.easynet.net}userListRequest

我知道为什么会抛出这个错误,在我的 wsdl 操作中写成

<operation name="getDCList"><input message="tns:userListRequest"/><output message="tns:userListResponse"/></operation>
<operation name="getAMList"><input message="tns:userListRequest"/><output message="tns:userListResponse"/></operation>

我只是为这两个操作重用了 userListRequest 参数,我相信错误是因为在两个操作中指定了相同的参数(userListRequest)而引发的。

有没有办法在不更改 wsdl 的情况下避免此错误?(据我所知,wsdl 1.2 不允许操作重载,但输入参数重载?)。

4

4 回答 4

11

如问题中所述:

有没有办法在不更改 wsdl 的情况下避免此错误?

如果您无法修复 WSDL,您可以禁用其验证:

-验证=无

或者如果您使用的是 Maven:

<configuration>
    <wsdlOptions>
        <wsdlOption>
            <wsdl>${basedir}/src/main/wsdl/my.wsdl</wsdl>
            <validate>none</validate>
        </wsdlOption>
    </wsdlOptions>
</configuration>

不确定这是否不会在运行时引起问题。我会很快找到这个并将更新这篇文章。

于 2014-06-25T13:20:37.047 回答
11

这样的 WSDL 将不符合 WSI-BasicProfile。看:

http://www.ws-i.org/profiles/basicprofile-1.1.html#Operation_Signatures

配置文件将操作签名定义为将出现在 soap:Body 中的元素的名称。因此,如果两个操作使用相同的子元素(或您的情况下的消息),则它们被视为非唯一且违反:

R2710 The operations in a wsdl:binding in a DESCRIPTION MUST result in operation signatures that are different from one another.
于 2012-10-23T15:48:05.190 回答
0

如果可以更改 WSDL 并且使用 WS-I Basic Profile 2.0,则可以向元素(在元素内)wsa:Action添加唯一值wsdl:inputwsdl:operation

例如

<wsdl:operation name="update">
  <wsdl:input message="tns:myMessage" wsam:Action="namespace/port/operation" />
</wsdl:operation>

在 WS-I 基本概要 2.0 中,“操作签名”的定义:“概要将“操作签名”定义为 SOAP 输入消息的 SOAP 主体的子元素的完全限定名称,该名称由 WSDL 绑定中的操作描述以及 wsa:Action SOAP 标头块的 URI 值(如果存在)。”

于 2015-09-02T14:21:59.683 回答
0

另一种解决方法是尝试从 WSDL 获取模式文件。和下面的插件在maven中生成java类

<plugin>
    <groupId>org.jvnet.jax-ws-commons</groupId>
    <artifactId>jaxws-maven-plugin</artifactId>
    <version>2.3</version>
    <executions>
        <execution>
            <id>schema1-generate</id>
            <goals>
                <goal>wsimport</goal>
            </goals>
            <configuration>
                <extension>true</extension>
                <bindingFiles>
                    <bindingFile>${basedir}/src/main/resources/wsdl/service-bindings.xjc</bindingFile>
                </bindingFiles>
                <wsdlDirectory>src/main/resources/wsdl</wsdlDirectory>
                <wsdlFiles>
                    <wsdlFile>Service.wsdl</wsdlFile>
                </wsdlFiles>
                <keep>true</keep>
                <sourceDestDir>target/generated-code/src</sourceDestDir>
                <vmArgs>
                    <vmArg>-Djavax.xml.accessExternalSchema=all</vmArg>
                </vmArgs>
            </configuration>
            <phase>generate-sources</phase>
        </execution>
    </executions>
</plugin>
于 2017-05-31T14:50:34.917 回答