首次运行时,CXF Soap Client无法连接

时间:2016-10-14 19:11:52

标签: java web-services soap java-8 cxf

当我创建一个cxf客户端来调用SOAP Web服务时,它返回connection refusedUnexpected end of file from server。但事情是,它只是在第一次请求时发生,之后它就像客户端已经预热了#34;并且实际上开始工作。

知道为什么会这样吗?

...
if(port == null) {
  JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
  factory.getInInterceptors().add(new LoggingInInterceptor());
  factory.getOutInterceptors().add(new LoggingOutInterceptor());
  factory.setAddress("http://localhost:9000/helloWorld");
  port = factory.create(HelloWorld.class);

  ... 
  Client client= ClientProxy.getClient(port);
  HTTPConduit http = (HTTPConduit) client.getConduit();
  HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
  httpClientPolicy.setAllowChunking(false);
  http.setClient(httpClientPolicy);
}

port.someMethod();  // fails on first run, but succeeds on all following runs
...

删除if - 语句会导致客户端在每次调用时都失败,而不仅仅是第一次调用。我真的感到困惑,并希望得到任何帮助。

1 个答案:

答案 0 :(得分:0)

这个问题似乎是通过TLS 1.2引起的。在Java8中,default TLS version changed从TLSv1到TLSv1.2。即使使用最新版本的CXF(3.1.7),TLS 1.2似乎也不起作用。所以解决方案是设置用于CXF的TLS版本:

...
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setAllowChunking(false);
httpClientPolicy.setAutoRedirect(true);
httpClientPolicy.setConnection(ConnectionType.KEEP_ALIVE);

String proxyUrl = "http://proxy.com";
String proxyPortString = "8080";
HTTPConduit http = (HTTPConduit)client.getConduit();
SSLContext sslContext = SSLContext.getInstance("TLSv1");
sslContext.init(null, null, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
TLSClientParameters tlsClientParameters = new TLSClientParameters();
tlsClientParameters.setUseHttpsURLConnectionDefaultSslSocketFactory(true);

http.setTlsClientParameters(tlsClientParameters);
http.setClient(httpClientPolicy);