2016-11-21 16 views
1

Tomcat 6にAxis2(1.5.1)Webサービスがデプロイされており、VMware WebサービスSDK(JAX-WSサービス)を呼び出そうとしています。これはセッションを維持する必要があるため失敗します(SESSION_MAINTAIN_PROPERTY = true)。 JAX-WSクライアントjarを呼び出すときにAxis2を回避する方法はありますか?ここでJAX-WSクライアントjarを呼び出すJava Axis2 Webサービス

スタックトレースです:

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

が問題

問題は3倍であることが判明しました。最初の問題は古くなったAxis2バージョン(1.5.1)でした。他の2つの問題はコードベースでした。

ソリューション

は、最新バージョン(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はセッションを維持しているとき、セッションクッキーを設定する最初の呼び出しが必要です。サービスコンテンツを取得するためのVMware APIへの最初の呼び出しはセッションを必要としないので、クッキーを返しません。ここでの解決策は、サービスコンテンツを取得するために排他的に使用される別の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に付属のサンプル・コードのスニペットを使用して示されています。

関連する問題