NullPointerException при получении информации о сеансе через ActionContext

В настоящее время я работаю над структурой организации, чтобы перенести ее в Struts 2 из Webworks с использованием IBM WebSphere 7. Я выполнил шаги, перечисленные ниже:

1) импортировал struts2-core-2.3.16.jar наряду с другими зависимостями JAR.

2) Переименован xwork.xml в struts.xml и изменил настройку в web.xml использовать StrutsPrepareAndExecuteFilter,

3) Заменили JAR-код веб-сайта на код Struts2 и код XWwork на код Xwork2 соответственно в перехватчиках и контроллерах.

Сервер запускается нормально, и развертывание проходит нормально. Когда я запускаю приложение, я получаю NullPointerException это происходит потому, что код одного из перехватчиков пытается получить информацию о сеансе и получает нулевой ответ. Я отладил его и увидел, что информация о сеансе недоступна в ActionContext или ActionInvocation пример. Какие могут быть возможные причины для этого?

Трассировка стека: (в целях конфиденциальности я скрыл название организации)

java.lang.NullPointerException 
    com.somecompany.merchandiseplanning.controller.AbstractAuthorizationInterceptor.getBusinessServicesString(AbstractAuthorizationInterceptor.java:57)
    com.somecompany.merchandiseplanning.controller.AbstractAuthorizationInterceptor.initializeBusinessServices(AbstractAuthorizationInterceptor.java:63)
    com.somecompany.merchandiseplanning.controller.AbstractAuthorizationInterceptor.intercept(AbstractAuthorizationInterceptor.java:35)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
    org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:562)
    org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99)
    com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:188)
    com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:116)
    com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilterChain.java:77)
    com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:908)
    com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:997)
    com.ibm.ws.webcontainer.extension.DefaultExtensionProcessor.invokeFilters(DefaultExtensionProcessor.java:1043)
    com.ibm.ws.webcontainer.extension.DefaultExtensionProcessor.handleRequest(DefaultExtensionProcessor.java:963)
    com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3933)
    com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:276)
    com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:931)
    com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1583)
    com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:186)
    com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:445)
    com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:504)
    com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:301)
    com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.ready(HttpInboundLink.java:275)
    com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.sendToDiscriminators(NewConnectionInitialReadCallback.java:214)
    com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.complete(NewConnectionInitialReadCallback.java:113)
    com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165)
    com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
    com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
    com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
    com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)
    com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)
    com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905)
    com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1604)

Кусок кода, который заключен в стек ошибок и пытается извлечь сеанс:

private String getBusinessServicesString(){

Map session = ActionContext.getContext().getSession();  //Error : No session retrived

UserInfo userInfo = (UserInfo) session.get("userinfo");
return userInfo.getUserLoginId() + "_BUSINESS_SERVICES";
    }

Я пытался заменить его на

Map session = actionInvocation.getInvocationContext().getSession();

с actionInvocation быть примером ActionInvocation передан в методе перехвата Перехватчика, но там я получаю тот же нулевой ответ.

Любая помощь будет высоко ценится!

1 ответ

Вы получите сеанс из ActionContext в классе действия только тогда, когда действие инициируется фильтром struts2.

В этом случае реализовать SessionAware интерфейс в вашем классе (содержащий метод getBusinessServicesString()) и использовать атрибут сеанса интерфейса для получения сеанса. Предположим, ABC - это ваш класс действий, тогда это можно сделать, как показано ниже.

public class ABC extends ActionSupport implements SessionAware {

    private Map session;

 public void setSession(Map session) {
  this.session = session;
 }

 public Map getSession() {
  return session;
 }

    private String getBusinessServicesString(){
      session = ActionContext.getContext().getSession();  
      UserInfo userInfo = (UserInfo) session.get("userinfo");
      return userInfo.getUserLoginId() + "_BUSINESS_SERVICES";
    }

}

Другие вопросы по тегам