2016-11-21 11 views
1

У меня есть веб-служба Axis2 (1.5.1), развернутая на Tomcat 6, и я пытаюсь вызвать SDK службы VMware (служба JAX-WS). Это не удается, так как мне нужно поддерживать сеансы (SESSION_MAINTAIN_PROPERTY = true). Есть ли способ обойти Axis2 при вызове банкомата клиента JAX-WS?Java Axis2 Веб-сервис, вызывающий 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 поддерживает сессии, он ожидает, что первый вызов, чтобы установить куки сессии. Первый вызов API VMware для извлечения содержимого службы не требует сеанса, поэтому он не возвращает 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.