Struts 2.3.37迁2.5.33遇404及OGNL等异常求解决
Struts 2.3→2.5迁移404及相关错误解决方案
先解决Action映射找不到(Dispatcher警告)——这是404的核心原因
- 核对
struts.xml配置:确认namespace="/reconciliation"的package下,确实存在name="reconciliation_loadReconciliationBalance"的Action配置,检查拼写是否一致;若Action用了非execute方法,要确保method属性正确指定。 - 检查注解配置(如果用了注解):Struts2.5的
@Action注解规则更严格,要保证namespace属性和目标路径匹配,Action类必须继承ActionSupport或实现Action接口,同时确认类被容器正确扫描到。 - 统一Jar包版本:确保所有Struts相关Jar都是2.5.33版本,不要混合2.3的Jar;如果用注解开发,必须引入
struts2-convention-plugin,缺了这个会导致注解Action无法被识别。
修复OgnlValueStack警告
- 改掉JSP里直接访问
struts.actionMapping、struts.valueStack的代码:2.5版本不再支持这种直接访问方式,换成Struts标签,比如用<s:property value="actionMapping"/>获取对应值;Java代码里通过ActionContext来获取相关对象。 - 确保OGNL版本适配:不要单独引入旧版OGNL Jar,直接用Struts2.5.33自带的OGNL包,避免版本不兼容。
解决会话监听器空指针
- 检查监听器代码:在调用
session.getAttribute()之后,必须先判断返回值是否为null再操作,不要直接对可能为空的对象调用方法。 - 适配Session获取方式:在监听器里用
ServletActionContext.getRequest().getSession(false)获取Session,避免强制创建不存在的Session引发空指针,同时确保监听器的初始化、销毁逻辑符合Servlet规范。
额外排查点
- 核对web.xml:把旧的
FilterDispatcher换成Struts2.5的StrutsPrepareAndExecuteFilter,并确认filter-mapping的url-pattern设为/*。 - 清理缓存:删掉Tomcat的work目录和项目的target目录,重新编译打包,避免旧的class或配置缓存干扰。
内容的提问来源于stack exchange,提问作者Office laptop
相关产品推荐
相关产品推荐

