使用struts2(6.3.0.2)将OGNL从3.3.4提升到3.4.2时出错

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

我的应用程序基于struts2(v 6.3.0.2),我目前使用ognl v3.3.4作为其依赖项之一。该应用程序在这些版本上运行良好。

当我尝试将 OGNL 升级到最新版本(即 3.4.2)时,我收到以下错误:

                at com.opensymphony.xwork2.ognl.OgnlValueStack.setRoot(OgnlValueStack.java:102)
                at com.opensymphony.xwork2.ognl.OgnlValueStack.<init>(OgnlValueStack.java:81)
                at com.opensymphony.xwork2.ognl.OgnlValueStackFactory.createValueStack(OgnlValueStackFactory.java:62)
                at com.opensymphony.xwork2.config.impl.DefaultConfiguration.setContext(DefaultConfiguration.java:244)
                at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:208)
                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:1079)
                at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:537)
                at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:571)
                at org.apache.struts2.dispatcher.InitOperations.initDispatcher(InitOperations.java:48)
                at org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepareAndExecuteFilter.java:60)
                at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:262)
                at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:244)
                at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:97)
                at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4311)
                at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4940)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171)
                at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:683)
                at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:658)
                at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:661)
                at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1014)
                at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1866)
                at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
                at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
                at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
                at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:118)
                at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:816)
                at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:468)
                at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1584)
                at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:312)
                at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:114)
                at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:402)
                at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:345)
                at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:893)
                at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:794)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171)
                at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1332)
                at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1322)
                at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
                at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
                at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140)
                at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:866)
                at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:248)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171)
                at org.apache.catalina.core.StandardService.startInternal(StandardService.java:433)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171)
                at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:925)
                at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171)
                at org.apache.catalina.startup.Catalina.start(Catalina.java:735)
                at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
                at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
                at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
                at java.base/java.lang.reflect.Method.invoke(Method.java:566)
                at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:345)
                at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:476)

据我所知,ognl.OgnlValueStack.setRoot 调用ognl.Ognl.createDefaultContext。 在3.3.4中createDefaultContext返回类型是Map。 3.4.2中createDefaultContext的返回类型是OgnlContext。 这种不兼容性是错误的原因,但从我的代码角度来看有没有解决方案?或者它只是 OGNL (3.4.2) 与 struts2 (6.3.0.2) 不兼容。

struts2 ognl
1个回答
0
投票

OgnlContext
是一个
Map<String, Object>
。在 Struts 2 中,
OgnlContext
设置为
ActionContext
,并且
ValueStack
是其中的根对象。欲了解更多信息,请阅读:

框架将 OGNL 上下文设置为我们的

ActionContext
,并将
ValueStack
设置为 OGNL 根对象。 (
ValueStack
是多个对象的集合,但对于 OGNL 来说,它似乎是单个对象)。除了值堆栈之外,框架还将其他对象放置在
ActionContext
中,包括表示应用程序、会话和请求上下文的映射。这些对象与值堆栈(我们的 OGNL 根)一起共存于
ActionContext
中。

ActionContext
不是
Map<String, Object>
,但您可以使用

获取上下文映射
OgnlContext context = (OgnlContext) ActionContext.getContext().getContextMap();

ValuStack
有自己的上下文。还有一个
Map<String, Object>
你可以获得

OgnlContext context = (OgnlContext) ActionContext.getContext().getValueStack().getContext();

您使用哪个版本取决于实现。您不能只提升 API 的一个版本并将其与需要较低版本的工件一起使用。

© www.soinside.com 2019 - 2024. All rights reserved.