java - 从引用本地主机的远程 WSDL 创建 CXF 客户端

标签 java cxf

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

网络服务的 wsdl 对本地主机进行了多次引用,例如:

<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>
...

当我尝试构建客户端时,由于对本地主机的引用而导致目标失败:

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 理解本地主机引用与 wsdl 主机相关,并在生成客户端时自动将它们替换为适当的主机名?

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

提前感谢您的回答。

(我已经用 remotehost 等通用名称替换了我的实际服务名称)

最佳答案

你想让 CXF 理解本地主机引用与 wsdl 主机相关,但这不是任何工具应该理解的东西,因为 WSDL 可以从任何位置导入其他 WSDL,这可能是 在某些情况下 正确的引用。只是您的情况并非如此,这是您要连接到的站点的配置错误

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

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

关于java - 从引用本地主机的远程 WSDL 创建 CXF 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10663933/

相关文章:

JavaFX:将像素写入 PixelWriter 的最快方法

java - java中Strictfp是什么意思?

java - 在哪里可以找到我的 WADL? (CXF)

java - 如何在未启用日志记录功能的情况下在 Out 拦截器中获取 http 响应正文?

java - 从其他类访问内部类

java - azure-cosmosdb-java 中的 "group by"功能

java - mysql View 的结果集不匹配

java - 如何仅使用自定义命令执行 maven-plugin?

java - 如何使 CXF 日志记录功能与 SOAP 消息一起使用?

java - 生成Apache CXF客户端时,为什么实例化客户端时还需要WSDL?