2016-11-21 105 views
1

我有一個在Tomcat 6上部署的Axis2(1.5.1)Web服務,並且我試圖調用VMware Web服務SDK(JAX-WS服務)。由於我需要維護會話(SESSION_MAINTAIN_PROPERTY = true),因此失敗。調用JAX-WS客戶端jar時是否有辦法繞過Axis2?Java Axis2 Web服務調用JAX-WS客戶端jar

這裏是堆棧跟蹤:

javax.xml.ws.WebServiceException: Error: Maintain Session is enabled but none of the session properties (Cookies, Over-written URL) are returned. 
    at org.apache.axis2.jaxws.ExceptionFactory.createWebServiceException(ExceptionFactory.java:173) 
    at org.apache.axis2.jaxws.ExceptionFactory.makeWebServiceException(ExceptionFactory.java:70) 
    at org.apache.axis2.jaxws.ExceptionFactory.makeWebServiceException(ExceptionFactory.java:118) 
    at org.apache.axis2.jaxws.BindingProvider.setupSessionContext(BindingProvider.java:242) 
    at org.apache.axis2.jaxws.BindingProvider.checkMaintainSessionState(BindingProvider.java:209) 
    at org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.invokeSEIMethod(JAXWSProxyHandler.java:320) 
    at org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.invoke(JAXWSProxyHandler.java:159) 
    at com.sun.proxy.$Proxy12.retrieveServiceContent(Unknown Source) 
    at com.company.product.CredAuthHostSkeleton.getAuthKey(Unknown Source) 
    at com.company.product.CredAuthHostMessageReceiverInOut.invokeBusinessLogic(Unknown Source) 
    at org.apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.java:40) 
    at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:114) 
    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:173) 
    at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:167) 
    at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:142) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
    at java.lang.Thread.run(Unknown Source) 

回答

0

問題

問題原來是三倍。第一個問題是過時的Axis2版本(1.5.1),另外兩個問題是基於代碼的。

解決方案

升級軸裝版到最新版本後(從1.5.1去1.7.4),下面的代碼更改固定問題:

  1. 由於Axis2的期望會話cookie的名稱爲JSESSIONID和VMware返回vmware_soap_session,需要設置CUSTOM_COOKIE_ID屬性,以便Axis2檢測到會話cookie已設置。

    VimService vimService = new VimService(); 
    VimPortType vimPort = vimService.getVimPort(); 
    
    Map<String, Object> ctxt = ((BindingProvider)vimPort).getRequestContext(); 
    ctxt.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url.toString()); 
    ctxt.put(org.apache.axis2.Constants.CUSTOM_COOKIE_ID, "vmware_soap_session"); 
    ctxt.put(BindingProvider.SESSION_MAINTAIN_PROPERTY, true); 
    
  2. 當Axis2維護會話時,它期望第一次調用來設置會話cookie。第一次調用VMware API來檢索服務內容不需要會話,因此它不返回cookie。這裏的解決方案是添加另一個專門用於檢索服務內容的VimService和VimPortType。這些更改後,登錄電話將工作。

    VimService vimServiceRSC = new VimService(); 
    VimPortType vimPortRSC = vimService.getVimPort(); 
    
    Map<String, Object> ctxtRSC = ((BindingProvider)vimPortRSC).getRequestContext(); 
    ctxtRSC.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url.toString()); 
    
    ServiceContent serviceContent = vimPortRSC.retrieveServiceContent(this.getServiceInstanceRef()); 
    vimPort.login(serviceContent.getSessionManager(), "user", "password", null); 
    

的代碼的變化是使用設置有VMware的SDK的示例代碼片段所示。