Java Https web服务调用失败
我们已经在JDK 6中使用Java Https web服务调用失败,java,web-services,soap,websphere,jax-ws,Java,Web Services,Soap,Websphere,Jax Ws,我们已经在JDK 6中使用JAX-WS RI 2.1.6实现了webservice调用现在,当我们启用httpswebservice调用停止到达服务器时,问题出现了,java报告如下错误 javax.xml.ws.WebServiceException:java.io.IOException:Async io 操作失败(3),原因:RC:55指定的网络资源 或设备不再可用 现在我已经在SoapUI中对此进行了测试,并在那里收到了来自服务的响应 研究了各种各样的解决方案,它告诉我们提供超时设置,但
JAX-WS RI 2.1.6实现了webservice调用
现在,当我们启用https
webservice调用停止到达服务器时,问题出现了,java报告如下错误
javax.xml.ws.WebServiceException:java.io.IOException:Async io
操作失败(3),原因:RC:55指定的网络资源
或设备不再可用
现在我已经在SoapUI
中对此进行了测试,并在那里收到了来自服务的响应
研究了各种各样的解决方案,它告诉我们提供超时设置,但似乎没有任何效果
@WebEndpoint(name = "RulesSoap")
public RulesSoap getRulesSoap() {
((BindingProvider)super.getPort(new QName("urn:decision:Rules", "RulesSoap"), RulesSoap.class)).getRequestContext().put("com.sun.xml.internal.ws.connect.timeout", 1000);
((BindingProvider)super.getPort(new QName("urn:decision:Rules", "RulesSoap"), RulesSoap.class)).getRequestContext().put("com.sun.xml.internal.ws.request.timeout", 1000);
return super.getPort(new QName("urn:decision:Rules", "RulesSoap"), RulesSoap.class);
}
仅供参考,JAX-WS实现遵循了几条简单的路线,
当然,我们将所有必要的数据提交到各自的存根中,但我不在这里提交,因为我们的http
调用正在通过
Rules rules = new Rules(new URL(url), new QName("urn:decision:Rules", "Rules"));
RulesSoap rulesSoap = rules.getRulesSoap();
CorticonResponse response = rulesSoap.processRequest(request);
注意:我们的应用服务器websphereapplicationserver
和版本7.0.0.19
提前感谢。您使用的是什么协议/密码?您已经提到,WAS7上的webservice与JDK6有连接,Java 6不支持TLS1.2(并且TLS1.1仅来自某些fixpack) 见此:
经过大量努力,我们解决了这个问题。如果发生任何与此相关的情况,我将提供步骤,如何找到根本原因 第1步: 首先,我们通过以下设置在
WebSphereApplicationServer
中启用了soap跟踪
管理控制台>服务器>服务器类型>WebSphere应用程序服务器>
{您的服务器}>故障排除>更改日志详细级别>运行时
在运行时,请将其放入,*=info:com.ibm.ws.webvcs.*=all:org.apache.axis2.jaxws.*=all
此步骤将在日志文件夹中创建trace.log
文件。
现在,服务器发出的任何web服务请求都将向该文件添加日志和必要的道具,如端点、请求、响应等
第二步:
读取这个trace.log
文件,我们发现了以下端点
PropertyValid 1 org.apache.axis2.jaxws.client.PropertyValidator validate validate property=(javax.xml.ws.service.endpoint.address) with value=(http://uxm.solutions.lnet.com:9445/axis/dswsdl/Rules/1/0)
HTTPConnectio 3 resetConnection : http://uxm.solutions.lnet.com:9445/axis/dswsdl/Rules/1/0 Persistent : true
现在,如果您注意到我们的soap具有端点地址javax.xml.ws.service.endpoint.address
,其中协议仍在使用http
,这导致ssl握手失败
第三步:
解决方案因为这是覆盖soap存根中的端点,可以通过添加以下行来实现
RulesSoap rulesSoap = rules.getRulesSoap();
((BindingProvider)rulesSoap).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "https://uxm.solutions.lnet.com:9445/axis/dswsdl/Rules/1/0");
结论:
因此,我认为,即使我们在创建对象时传递https
url,但在运行时仍然不使用https
url,对我来说,这看起来像是JAX-WS
的存根创建问题
谢谢