Struts 2 6.4.0初始化OgnlValueStack时遇NoSuchMethodError求助
Struts 2(v6.4.0)初始化OgnlValueStack时触发java.lang.NoSuchMethodError错误
错误信息如下:
java.lang.NoSuchMethodError: 'java.util.Map ognl.Ognl.createDefaultContext(java.lang.Object, ognl.MemberAccess, ognl.ClassResolver, ognl.TypeConverter)' at com.opensymphony.xwork2.ognl.OgnlValueStack.setRoot(OgnlValueStack.java:151) at com.opensymphony.xwork2.ognl.OgnlValueStack.<init>(OgnlValueStack.java:89) at com.opensymphony.xwork2.ognl.OgnlValueStackFactory.createValueStack(OgnlValueStackFactory.java:86) at com.opensymphony.xwork2.ognl.OgnlValueStackFactory.createValueStack(OgnlValueStackFactory.java:76) at com.opensymphony.xwork2.config.impl.DefaultConfiguration.setContext(DefaultConfiguration.java:329) at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:295) at com.opensymphony.xwork2.config.ConfigurationManager.reload(ConfigurationManager.java:227) at com.opensymphony.xwork2.config.ConfigurationManager.initialiseConfiguration(ConfigurationManager.java:84) at com.opensymphony.xwork2.config.ConfigurationManager.wasConfigInitialised(ConfigurationManager.java:72) at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:61) at org.apache.struts2.dispatcher.Dispatcher.getContainer(Dispatcher.java:1124) at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:625) at org.apache.struts2.dispatcher.InitOperations.initDispatcher(InitOperations.java:48) at org.apache.struts2.dispatcher.listener.StrutsListener.contextInitialized(StrutsListener.java:43) ...
问题详情
追踪发现问题出在OgnlValueStack的setRoot方法,该方法调用Ognl.createDefaultContext时使用的代码如下:
this.context = Ognl.createDefaultContext(this.root, securityMemberAccess, accessor, new OgnlTypeConverterWrapper(xworkConverter));
但查看OGNL的Ognl.java类,发现createDefaultContext方法没有匹配的签名,现有签名为:
public static Map createDefaultContext(Object root, ClassResolver classResolver, TypeConverter converter, MemberAccess memberAccess) { return addDefaultContext(root, classResolver, converter, memberAccess, new OgnlContext()); }
项目配置
- Struts 2版本:6.4.0
- OGNL版本:3.3.4
- Tomcat版本:9.0.82
- Java版本:11
已采取步骤
- 检查OGNL版本兼容性:确认OGNL版本是否符合Struts 2依赖要求
- 检查OGNL方法签名:确认createDefaultContext方法签名与OgnlValueStack中的调用不匹配
- 验证Maven构建:应用通过Maven编译成功
- Tomcat运行测试:部署到Tomcat时出现上述错误
疑问
- 当前使用的Struts 2和OGNL版本是否存在不匹配?
- 是否有其他人遇到过Ognl.createDefaultContext的类似问题?
- Struts 2和OGNL出现该错误是否有已知问题或解决方案?
补充说明
经过进一步排查,确认Struts中调用createDefaultContext的参数类型是正确的,符合方法签名参数要求:
- 调用代码:
this.context = Ognl.createDefaultContext(this.root, securityMemberAccess, accessor, new OgnlTypeConverterWrapper(xworkConverter)); this.root:类型为Object,符合预期accessor:类型为ClassResolver(RootAccessor继承自ClassResolver),符合预期new OgnlTypeConverterWrapper(xworkConverter):类型为TypeConverter,符合预期securityMemberAccess:类型为MemberAccess,符合预期
内容的提问来源于stack exchange,提问作者Mamat Sky
相关产品推荐
相关产品推荐

