【问题标题】:NullPointerException while retrieving session information through ActionContext通过 ActionContext 检索会话信息时出现 NullPointerException
【发布时间】:2014-11-27 19:34:53
【问题描述】:

我目前正在开发一个组织的框架,以使用 IBM WebSphere 7 将其从 Webworks 迁移到 Struts 2。我遵循了以下步骤:

1) 导入了 struts2-core-2.3.16.jar 以及其他依赖项 JAR。

2) 将xwork.xml 重命名为struts.xml 并将web.xml 中的设置更改为使用StrutsPrepareAndExecuteFilter

3)将拦截器和控制器中的webwork JAR代码分别替换为struts2代码和xwork代码为xwork2代码。

服务器启动正常,部署正常。当我启动应用程序时,我得到一个NullPointerException,这是因为其中一个拦截器中的代码试图检索会话信息并得到一个空响应。我对其进行了调试,发现会话信息在ActionContextActionInvocation 实例中不可用。这可能是什么原因?

堆栈跟踪:(出于保密目的,我隐藏了组织的名称)

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();

actionInvocationActionInvocation 的一个实例,传入拦截器的拦截方法,但我在那里得到相同的空响应。

任何帮助将不胜感激!

【问题讨论】:

  • 这需要更多细节 - 什么是 ActionContext 对于初学者...
  • 您好,ActionContext 是 struts2 的核心功能,其中存储了会话等某些信息。您可以参考以下文档链接以获得更多说明:struts.apache.org/release/2.0.x/struts2-core/apidocs/com/…
  • 会话可能不可用,你想达到什么目的?
  • 嗯,以前整个框架都在 Webworks 上,应用程序运行良好。由于我尝试将其从相应的 Webworks 迁移到 struts2,我担心我可能错过了一些东西,因为我无法从抛出 NullPointerException 的 ActionContext 中获取会话信息。我不太了解 Webworks 如何设置会话信息,如果将其迁移到 struts 2,我可能会无意中删除它。
  • 只是添加,我必须登录到门户才能访问此应用程序,然后启动它。登录工作正常。当我尝试启动应用程序时,会抛出整个异常。

标签: java session struts2 websphere-7


【解决方案1】:

只有当 struts2 过滤器启动操作时,您才会从操作类中的 ActionContext 获取会话。

在这种情况下,在你的类中实现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";
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    相关资源
    最近更新 更多