【问题标题】:Creating a CXF client from a remote WSDL which references localhost从引用 localhost 的远程 WSDL 创建 CXF 客户端
【发布时间】:2012-05-19 09:21:15
【问题描述】:

我正在使用 CXF 生成用于连接到远程 Web 服务的客户端。我无法控制 web 服务或 wsdl 定义。

webservice 的 wsdl 多次引用 localhost,例如:

<soap12:address location="http://localhost:8002/request" />
<wsa10:EndPointReference>
    <wsa10:Address>http://localhost:8002/request</wsa10:Address>
</wsa10:EndPointReference>

我正在尝试使用 wsdl2java maven 目标生成我的客户端,同时指向远程 wsdl:

...
<wsdlOptions>
<wsdlOption>
<wsdl>http://remotehost:8002/?wsdl</wsdl>
<wsdlOption>
<wsdlOptions>
...

当我尝试构建客户端时,由于对 localhost 的引用,目标失败:

org.apache.cxf.wsd11.WSDLRuntimeException: Fail to create wsdl definition from :       http://remotehost:8002/?wsdl [ERROR] caused by : WSDLException (at  
/wsdldefinitions/wsdl:import) faultCode=PARSER_ERROR: Problem parsing  
'http://localhost:8002/?wsdl=wsdl0'.: java.net.ConnectionException: Connection refused: connect

有什么方法可以让CXF明白localhost引用与wsdl主机相关,并在生成客户端时自动替换为合适的主机名?

我已经设法通过将 wsdl 复制到本地文件并用适当的主机名手动替换本地主机引用来生成客户端。但是,我需要从远程 wsdl 定义而不是本地文件生成客户端。有谁知道可以实现的方法?我目前使用的是 cxf 版本 2.6.0

提前感谢您的任何回答。

(我已将我的实际服务名称替换为通用名称,例如远程主机)

【问题讨论】:

  • 我想知道他们为什么会发布一个损坏的网络服务 - 使用它的其他任何人都会遇到同样的困难。

标签: java cxf


【解决方案1】:

您想让 CXF 了解 localhost 引用与 wsdl 主机相关,但这不是任何工具都应该理解的,因为 WSDL 可以从任何位置导入其他 WSDL,这可能是 在某些情况下正确的参考。根本不是您的情况,而是您要连接的站点的配置错误

我了解您将 WSDL 的 URL 作为参数提供给工具制作代理动态,因此您不能只下载它并更改引用。

我建议的解决方法是编写简单的代理,一个连接到远程 URL(作为参数给出)并返回 WSDL 的 servlet,将 localhost 引用更改为正确的引用。您可以将此 servlet 的 URL 作为参数提供给您的代理工厂。这不好,但唯一好的解决方案是提供者修复自己的 WSDL。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多