Struts2 v(6.4.0) 和 OGNL:createDefaultContext 方法的 NoSuchMethodError

问题描述 投票:0回答:1

当我尝试初始化

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));

项目设置:

  • Struts 2版本:6.4.0
  • OGNL版本:3.3.4
  • Tomcat版本:9.0.82
  • Java版本:11

采取的步骤:

  1. 检查 OGNL 版本兼容性: 确保 OGNL 版本与 Struts 2 依赖项中的预期版本匹配。
  2. 审查了 OGNL 中的方法签名: 确认
    createDefaultContext
    方法签名与
    OgnlValueStack
    中的调用不一致。
  3. 已验证的 Maven 构建: 我的应用程序使用 Maven 成功编译。
  4. 在 Tomcat 上运行应用程序: 当我使用 Tomcat 运行我的工件时出现错误。

问题:

  • 我使用的 Struts 2 和 OGNL 版本是否不匹配?
  • 有人遇到过类似的问题吗
    Ognl.createDefaultContext
  • Struts 2 和 OGNL 是否存在针对此错误的任何已知问题或解决方案?

任何帮助或建议将不胜感激。谢谢!

java tomcat struts2 nosuchmethoderror ognl
1个回答
0
投票

当前版本的

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。你应该使用这个版本。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.