我尝试使用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,Operations “{http://eordering.uk.easynet.net} getAMList”和 “{http://eordering.uk.easynet.net} getDCList”有同样的要求 body block {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不允许进行操作重载,但输入参数重载?)。
答案 0 :(得分: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.
答案 1 :(得分:7)
正如问题所述:
有没有办法在不更改wsdl的情况下避免此错误?
如果无法修复WSDL,则可以禁用其验证:
-validate =无
或者如果您使用的是Maven:
<configuration>
<wsdlOptions>
<wsdlOption>
<wsdl>${basedir}/src/main/wsdl/my.wsdl</wsdl>
<validate>none</validate>
</wsdlOption>
</wsdlOptions>
</configuration>
不确定这是否会在运行时导致问题。我很快就会发现这一点并将更新这篇文章。
答案 2 :(得分:0)
如果可以使用WSDL更改并使用WS-I Basic Profile 2.0,则可以将wsa:Action
unique value添加到元素wsdl:input
(元素wsdl:operation
内):< / p>
E.g。
<wsdl:operation name="update">
<wsdl:input message="tns:myMessage" wsam:Action="namespace/port/operation" />
</wsdl:operation>
在WS-I Basic Profile 2.0中,“操作签名”的定义: “配置文件将”操作签名“定义为WSDL绑定中的操作描述的SOAP输入消息的SOAP主体的子元素的完全限定名称,以及wsa:Action SOAP标头块的URI值(如果存在) 。“
答案 3 :(得分: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>