Java 通过ActionContext检索会话信息时出现NullPointerException
我目前正在开发一个组织的框架,以便使用IBM WebSphere 7将其从Webworks迁移到Struts 2。我遵循以下步骤: 1) 导入了Java 通过ActionContext检索会话信息时出现NullPointerException,java,session,struts2,websphere-7,Java,Session,Struts2,Websphere 7,我目前正在开发一个组织的框架,以便使用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代码 服务器正常
struts2-core-2.3.16.jar
以及其他依赖项jar
2) 将xwork.xml
重命名为struts.xml
,并将web.xml
中的设置更改为使用StrutsPrepareAndExecuteFilter
3) 在拦截器和控制器中,分别将webwork JAR代码替换为struts2代码,并将xwork代码替换为xwork2代码
服务器正常启动,部署正常进行。当我启动应用程序时,我得到一个NullPointerException
,这是因为其中一个拦截器中的代码试图检索会话信息并得到一个空响应。我调试了它,发现会话信息在ActionContext
或ActionInvocation
实例中不可用。可能的原因是什么
堆栈跟踪:(出于保密目的,我隐藏了组织的名称)
包含在错误堆栈中并尝试检索会话的代码段为:
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
是在拦截器的intercept方法中传递的actionInvocation
的一个实例,但是我在那里得到了相同的空响应
任何帮助都将不胜感激 只有在struts2筛选器启动操作时,才能从action类中的ActionContext获取会话 在这种情况下,在类中实现
SessionAware
接口(包含方法getBusinessServicesString()
),并使用接口的session属性获取会话。
假设ABC是你的动作类,那么它可以按如下方式完成
公共类ABC扩展操作支持实现SessionAware{
私人Map会议;
公共无效设置会话(映射会话){
this.session=会话;
}
公共映射getSession(){
返回会议;
}
私有字符串getBusinessServicesString(){
会话=ActionContext.getContext().getSession();
UserInfo UserInfo=(UserInfo)session.get(“UserInfo”);
返回userInfo.getUserLoginId()+“_BUSINESS_SERVICES”;
}
}
这需要更多的细节-首先,什么是ActionContext
…嗨,ActionContext是struts2的核心功能,其中存储了会话等特定信息。您可以参考以下文档链接以获得更多说明:会话可能不可用,您想得到什么?好的,以前整个框架都在Webworks上,应用程序运行良好。由于我试图将它从相应的Webworks迁移到struts2,我担心我可能错过了一些东西,因为我无法从ActionContext获取会话信息,这会引发NullPointerException。我不太了解Webworks可能是如何设置会话信息的,如果将其迁移到struts 2,我可能会无意中将其删除。只需添加,我必须登录门户才能访问此应用程序,然后启动它。登录工作正常。当我尝试启动应用程序时,会抛出整个异常。
Map session = actionInvocation.getInvocationContext().getSession();