1

我正在开发使用现有 SOAP Web 服务的第二个客户端应用程序。我使用最新的 Apache CXF 2.3 工具从现有的 WSDL 生成 Java

wsdl2java -client -ant http://172.20.0.22/someletters/TradingServer.asmx?WSDL

并得到

WSDLToJava 错误:java.lang.IllegalArgumentException:此服务中已存在名称为 [{urn:someschema:TradingServer}GetTradeSummary] 的操作

这有逻辑,因为在查看 WSDL 文件时,您可以看到 2 个类似的操作 GetTradeSummary,但使用不同的 soapAction。

<wsdl:operation name="GetTradeSummary">
  <soap:operation soapAction="urn:someschema/GetTradeSummary" style="document" />
  <wsdl:input>
    <soap:body use="literal" />
  </wsdl:input>
  <wsdl:output>
    <soap:body use="literal" />
  </wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetTradeSummary">
  <soap:operation soapAction="urn:someschema/GetTradeSummary_Open" style="document" />
  <wsdl:input name="GetTradeSummary_Open">
    <soap:body use="literal" />
  </wsdl:input>
  <wsdl:output name="GetTradeSummary_Open">
    <soap:body use="literal" />
  </wsdl:output>
</wsdl:operation>

a) 按照某种标准,它真的被认为是错误的吗?哪一个?

b)有没有办法绕过这个并为其余部分生成Java脚手架?在CXF WSDL to Java tool web page中没有提到任何内容,除了 -autoNameResolution 没有帮助。

4

1 回答 1

2

WSI-Basic Profile 明确不允许这样做。如果你看:

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

第 4.5.3 节特别指出:

配置文件不允许 wsdl:portType 中的操作名称重载。

我认为在 CXF 中没有办法解决它,因为操作存储在以 QName 为键的 Map 中。由于 QName 不是唯一的,因此只能在映射中存储一个操作。

于 2010-10-29T14:34:39.943 回答