我正在使用CXF生成用于连接远程Web服务的客户端。我对webservice或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复制到本地文件并使用适当的主机名替换localhost引用来生成客户端。但是,我需要从远程wsdl定义而不是本地文件生成客户端。有谁知道这可以实现的方式?我目前正在使用cxf版本2.6.0
提前感谢您的任何答案。
(我已用通用名称替换我的实际服务名称,例如remotehost)
答案 0 :(得分:1)
您希望让CXF了解localhost引用与wsdl主机相关,但这不是任何工具都应该理解的东西,因为WSDL可以从任何位置导入其他WSDL,这可能是在某些情况下正确的参考。只是不是你的情况,它是你要连接的网站的配置错误。
我理解您将WSDL的URL作为工具的参数,使代理动态,因此您不能只下载它并更改引用。
解决方法我建议编写简单代理,一个连接到远程URL(作为参数给出)的servlet,并返回WSDL,将localhost引用更改为正确的引用。并且您将此servlet的URL作为参数提供给代理工厂。它不是很好,但唯一不错的解决方案是提供程序修复了自己的WSDL。