2016-08-18 3 views
1

Ich habe JaxwsDynamicClientFactory verwendet, um den https-Webdienst aufzurufen und den folgenden Code zu verwenden, um die SSL-Prüfung zu umgehen, da das SSL-Zertifikat des Webdienstes selbst signiert ist.JaxwsDynamicClientFactory kann den Webservice nicht aufrufen

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(); 
    } 

Aber ich, wenn ich den Code aufrufen, ich erhielt die Ausnahme:

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 
... 

Was mich verwirrt, ist, dass, wenn ich Httppost verwenden, um die Seife Nachricht senden (Natürlich habe ich einige Arbeits- herum, um SSL-Validierung zu überspringen), kann es erfolgreich Antwort zurückgeben, aber wenn JaxwsDynamicClientFatory verwendet, um dynamischen Client zu generieren, schlägt es fehl.

Ist etwas mit der SSL-Workaround-Teil des Codes verwandt?

Kann mir jemand helfen? Vielen Dank.

+0

i bemerkte erforderlich, dass Webservice verwendet IP-Filterung , nachdem ich meine IP in die weiße Liste gemacht habe, war ich nun in einer anderen Ausnahme gefangen: Verbindung aus – user2605926

Antwort

0

java.net.ConnectException: Operation timed out bedeutet, dass Ihre Anfrage innerhalb des Zeitrahmens keine Antwort erhalten hat. Überprüfen Sie https://stackoverflow.com/a/5663054/6371459

Ich habe das Problem bei der Ausführung Ihres Codes reproduziert. Die WSDL verweist auf 218.17.179.67/QhicPos/doService, die für mich nicht zugänglich ist. Dieses Problem ist vorherige eine SSL-Verbindung (das ist in der Tat nicht notwendig, da Endpunkt mit http veröffentlicht)

Vielleicht gibt es einen Schutz Firewall oder ein Proxy-

+0

Ich denke, ich muss eine SSLContextFactory angeben, aber für TLSClientParameters gibt es keine Methode namens 'setHostnameVerifier', gibt es irgendwo, dass ich kann das einstellen? – user2605926

+0

Die Methode existiert: https://cxf.apache.org/javadoc/latest/org/apache/cxf/configuration/jsse/TLSClientParameters.html#setHostnameVerifier(javax.net.ssl.HostnameVerifier). Vielleicht ist in Ihrer Version nicht vorhanden. Welche CXF-Version verwenden Sie? Ich denke 'TLSClientParameters.setDisableCNCheck' funktioniert auch – pedrofb

+0

meine Version ist 2.2.12, aber tatsächlich kann ich die ssl Prüfung Phrase übergeben, aber die Webservice aufrufen Ausnahme auslösen: org.apache.cxf.interceptor.Fault: Operation abgelaufen . Haben Sie eine Idee von diesem Problem? Liegt es an dem Serverproblem oder dem falschen Aufruf meines Clients? – 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){ 

      } 


     } 
    } 
Verwandte Themen