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";
}
}