当我尝试初始化
java.lang.NoSuchMethodError
时,我在使用 Struts 2 (v6.4.0) 的 Java 应用程序中遇到了 OgnlValueStack
。错误信息如下:
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)
...
问题详情:
我已将问题追溯到
setRoot
中的 OgnlValueStack
方法,该方法使用以下参数调用 Ognl.createDefaultContext
:
this.context = Ognl.createDefaultContext(this.root, securityMemberAccess, accessor, new OgnlTypeConverterWrapper(xworkConverter));
但是,当我查看 OGNL 中的
Ognl.java
类时,createDefaultContext
函数似乎没有匹配的方法签名:
this.context = Ognl.createDefaultContext(this.root, securityMemberAccess, accessor, new OgnlTypeConverterWrapper(xworkConverter));
项目设置:
采取的步骤:
createDefaultContext
方法签名与 OgnlValueStack
中的调用不一致。问题:
Ognl.createDefaultContext
?任何帮助或建议将不胜感激。谢谢!
当前版本的
Ognl
有一个在代码中缺少签名的方法:
public static OgnlContext createDefaultContext(Object root, MemberAccess memberAccess, ClassResolver classResolver, TypeConverter converter) {
return addDefaultContext(root, memberAccess, classResolver, converter, null);
}
仅问题该方法返回
OgnlContext
而不是 Map
。它提醒我与新版本的 Ognl 3.4.2 的不兼容问题在类路径上。
struts2-core 6.4.0版本依赖ognl 3.3.4。你应该使用这个版本。