2016-08-18 9 views
1

JaxwsDynamicClientFactoryを使用してhttps Webサービスを呼び出し、Webサービスssl証明書が自己署名されているため、次のコードを使用してsslチェックを回避します。JaxwsDynamicClientFactoryがWebサービスを呼び出せません

String wsUrl = "https://218.17.179.67:8443/QhicPos/doService?wsdl"; 
    String method = "doPosRequest"; 
    QName qName = new QName("http://service.pos.qhic.com/", method); 

    HttpsURLConnection.setDefaultSSLSocketFactory(TrustAnyFactory.getInstance().getSslContext().getSocketFactory()); 
    HostnameVerifier allHostsValid = (hostname, sslSession) -> true; 

    // Install the all-trusting host verifier 
    HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid); 

    JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance(); 
    Client client = clientFactory.createClient(wsUrl); 
    HTTPConduit conduit = (HTTPConduit) client.getConduit(); 

    HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy(); 

    conduit.getClient().setReceiveTimeout(0); 
    httpClientPolicy.setConnectionTimeout(6000000); 
    httpClientPolicy.setAllowChunking(false); 
    httpClientPolicy.setReceiveTimeout(6000000); 
    conduit.setClient(httpClientPolicy); 

    try { 
     Object[] rst = client.invoke(qName, new Object[]{xmlRequest}); 
     System.out.println(rst[0].toString()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

が、私はコードを呼び出すときに私は、私は例外が発生しました:私は混乱して作る

org.apache.cxf.phase.PhaseInterceptorChain doDefaultLogging 
Waring: Interceptor for {http://service.pos.qhic.com/}PosServiceImplService# {http://service.pos.qhic.com/}doPosRequest has thrown exception, unwinding now 
org.apache.cxf.interceptor.Fault: Operation timed out 

at org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor.writeParts(AbstractOutDatabindingInterceptor.java:108) 
at org.apache.cxf.wsdl.interceptors.BareOutInterceptor.handleMessage(BareOutInterceptor.java:68) 
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308) 
at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:514) 
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:423) 
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:324) 
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:277) 
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:297) 
at HttpsWebServiceClient.getClient(HttpsWebServiceClient.java:65) 
at HttpsWebServiceClient.main(HttpsWebServiceClient.java:91) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 

Caused by: com.ctc.wstx.exc.WstxIOException: Operation timed out 
at com.ctc.wstx.sw.BaseStreamWriter.flush(BaseStreamWriter.java:255) 
at org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor.writeParts(AbstractOutDatabindingInterceptor.java:106) 
... 14 more 

Caused by: java.net.ConnectException: Operation timed out 
... 

は、私はもちろん、SOAPメッセージを(送信するためにHttpPostを使用する場合、私はいくつかのワーク・を使用したことですSSL検証をスキップするために)、正常に応答を返すことができますが、JaxwsDynamicClientFatoryを使用して動的クライアントを生成すると失敗します。

これは、コードのssl回避策に関するものですか?

誰でも手伝ってもらえますか?どうもありがとう。

+0

必要とされている

私は、Webサービスは、IPフィルタリングを使用していることに気づきました 接続の外に – user2605926

答えて

0

java.net.ConnectException: Operation timed outは、ご要望が期間内に回答を得られなかったことを意味します。チェックhttps://stackoverflow.com/a/5663054/6371459

コードの実行中に問題が再現しました。 WSDLは、私にとってはアクセスできない218.17.179.67/QhicPos/doServiceを指しています。この問題は、任意のSSL接続に以前である(エンドポイントがhttpで公開されているので、それが実際に必要とされていない)たぶん、そこにファイアウォール保護があるか、プロキシ

+0

私はSSLContextFactoryを指定する必要があると思いますが、TLSClientParametersの場合、 'setHostnameVerifier'というメソッドはありません。どこかにありますか?これを設定できますか? – user2605926

+0

メソッドが存在する:https://cxf.apache.org/javadoc/latest/org/apache/cxf/configuration/jsse/TLSClientParameters.html#setHostnameVerifier(javax.net.ssl.HostnameVerifier)。多分あなたのバージョンには存在しません。どのCXFバージョンを使用していますか?私は 'TLSClientParameters.setDisableCNCheck'も動作します – pedrofb

+0

私のバージョンは2.2.12ですが、実際には私はsslチェックフレーズを渡すことができますが、例外を呼び出すwebserviceを呼び出すことができます: org.apache.cxf.interceptor.Fault:操作がタイムアウトしました。 この問題はありますか?それはサーバーの問題やクライアントの間違った呼び出しによるものですか? – user2605926

0
Following code worked for me 
BusFactory bf = CXFBusFactory.newInstance(); 
     Bus bus = bf.createBus(); 
     bus.getInInterceptors().add(new LoggingInInterceptor()); 
     bus.getOutInterceptors().add(new LoggingOutInterceptor()); 


     //MyHTTPConduitConfigurer myHttpConduitConfig = new MyHTTPConduitConfigurer(); 

     bus.setExtension(new MyHTTPConduitConfigurer(), HTTPConduitConfigurer.class); 

     JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance(bus); 


private static class SoapHTTPConduitConfigurer implements HTTPConduitConfigurer { 
     public void configure(String name, String address, HTTPConduit c) { 

      try{ 

       if(logger.isLoggable(Level.FINEST)) { 
        logger.log(Level.FINEST,"\n Setting TLS and Connection TimeOut :"); 
       } 
       HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();   
       httpClientPolicy.setConnectionTimeout(itfConfig.getConnectionTimeout()); 
       httpClientPolicy.setReceiveTimeout(itfConfig.getSoTimeout()); 
       c.setClient(httpClientPolicy); 
       if(tlsParams!=null) 
       c.setTlsClientParameters(tlsParams); 


      }catch(Exception ex){ 

      } 


     } 
    } 
関連する問題