You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 22:55:13