在Java客户端中,SOAP连接超时了,但在SOAPUI中没有。

4

我使用 wsimport 和给定的 wsdl 创建了一个 soap 客户端。我还使用 SoapUI 测试了服务。在使用 SoapUI 时没有问题,但是当使用我的 Java 客户端时出现了问题。

java.net.ConnectException: Connection timed out: connect

我在requestContext中的默认值如下:

com.sun.xml.internal.ws.connect.timeout=100000
javax.xml.ws.service.endpoint.address=[fully qualified domain name endpoint]
com.sun.xml.internal.ws.request.timeout=100000
javax.xml.ws.soap.http.soapaction.use=null
com.sun.xml.internal.ws.client.ContentNegotiation=none
javax.xml.ws.soap.http.soapaction.uri=null

我已经尝试增加超时时间,但仍无法连接。

还有其他人遇到过类似的问题吗?


1
连接超时是一个非常通用的错误。您应该提供更多具体信息。同时尝试使用HttpURLConnection类,因为它很容易进行故障排除,然后您可以返回到wsimport。您的soapui是否使用任何代理,因为这也可能会导致Java代码出现问题?您在soap ui中使用任何证书吗? - Shubham Kadlag
1
除了超时配置之外,您是否比较过SoapUI实际发送到服务的内容与Java发送的内容?在SoapUI中,左侧有用于创建请求的面板,但是一旦您发送请求,'原始'请求选项卡就会被填充。我经常使用它来比较SoapUI发送的内容与我的Java或Node应用程序。对我来说,这非常宝贵,可以突出显示我在应用程序中遗漏的内容。例如URL中的小错别字;请求类型,GET,PUSH等调用方法;有效载荷中缺少的某些属性;不正确的标头;证书;凭据... - Chris Adams
2个回答

0
问题是由于我处在代理之后。进行了不同的测试,发现使用Web浏览器(或SoapUI)可以访问资源,但从命令行中无法工作。
经过大量搜索,找到了一个简单的解决方案:要么将属性作为JVM参数传递,要么在代码中手动设置它,方法是System.setProperty("java.net.useSystemProxies", "true")。 JVM不能自己使用代理。
编辑
因为我使用了wsimport,所以我有一个jax-ws客户端。在实例化之前配置代理设置非常重要。
另一个编辑
如果你碰巧遇到问题并且正在使用应用程序服务器通过代理进行SOAP请求,您可能必须在服务器配置文件(例如catalina.properties如果使用tomcat)中指定java.net.useSystemProxies=true(或类似的)。

0

正如您所提到的,问题是代理问题,以下链接已经回答了这个问题。

如何在Java中使用HTTP代理

Java程序中的代理设置

如果您正在使用带有身份验证的代理,则必须同时设置代理和验证器。这在这里得到了解答。

使用Java进行身份验证的HTTP代理

编辑:

正如William Burnham所正确指出的那样,您必须在调用它们之前设置属性。 此外,我建议您在获取响应后立即使用System.clearProperty(key)清除属性,因为该属性设置为jvm的完整实例,直到重新启动,因此可能会对其他出站连接造成问题。


谢谢提供这些信息。在我写下自己的答案之前,我已经看过这些链接了,但它们确实很有用。如果使用jax-ws(就像我的情况一样),一个额外的细节是必须在初始化jax-ws客户端之前配置代理设置。我会相应地更新我的答案。 - geco17

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接