从 2.5.29 升级到 2.5.33 时出现 Struts2 DependencyException - 缺少 JAR 依赖项?

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

由于报告的安全问题,我正在努力更新 Struts2 应用程序。目前它使用的是 2.5.29,需要使用最新的 2.5.33。这是一个使用 Ant 构建的旧应用程序,因此我必须“手动”找出所有依赖的 JAR。然而,每当我尝试访问该应用程序时,我都会收到内部 500 错误,并带有相当大的堆栈跟踪。我在这里仅包含了我认为相关的堆栈跟踪部分:

Caused by: com.opensymphony.xwork2.inject.DependencyException: com.opensymphony.xwork2.inject.ContainerImpl$MissingDependencyException: No mapping found for dependency [type=com.opensymphony.xwork2.security.NotExcludedAcceptedPatternsChecker, name='default'] in public void org.apache.struts2.components.Component.setNotExcludedAcceptedPatterns(com.opensymphony.xwork2.security.NotExcludedAcceptedPatternsChecker).
        at com.opensymphony.xwork2.inject.ContainerImpl.addInjectorsForMembers(ContainerImpl.java:140) ~[struts2-core-2.5.33.jar:2.5.33]
        at com.opensymphony.xwork2.inject.ContainerImpl.addInjectorsForMethods(ContainerImpl.java:111) ~[struts2-core-2.5.33.jar:2.5.33]
        at com.opensymphony.xwork2.inject.ContainerImpl.addInjectors(ContainerImpl.java:89) ~[struts2-core-2.5.33.jar:2.5.33]
        at com.opensymphony.xwork2.inject.ContainerImpl.addInjectors(ContainerImpl.java:85) ~[struts2-core-2.5.33.jar:2.5.33]
        at com.opensymphony.xwork2.inject.ContainerImpl.addInjectors(ContainerImpl.java:85) ~[struts2-core-2.5.33.jar:2.5.33]
        at com.opensymphony.xwork2.inject.ContainerImpl$1.create(ContainerImpl.java:70) ~[struts2-core-2.5.33.jar:2.5.33]
        at com.opensymphony.xwork2.inject.ContainerImpl$1.create(ContainerImpl.java:66) ~[struts2-core-2.5.33.jar:2.5.33]
        at com.opensymphony.xwork2.inject.util.ReferenceCache$CallableCreate.call(ReferenceCache.java:155) ~[struts2-core-2.5.33.jar:2.5.33]
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[?:1.8.0_392]
        at com.opensymphony.xwork2.inject.util.ReferenceCache.internalCreate(ReferenceCache.java:79) ~[struts2-core-2.5.33.jar:2.5.33]
        at com.opensymphony.xwork2.inject.util.ReferenceCache.get(ReferenceCache.java:123) ~[struts2-core-2.5.33.jar:2.5.33]
        at com.opensymphony.xwork2.inject.ContainerImpl.inject(ContainerImpl.java:466) ~[struts2-core-2.5.33.jar:2.5.33]
        at com.opensymphony.xwork2.inject.ContainerImpl$6.call(ContainerImpl.java:505) ~[struts2-core-2.5.33.jar:2.5.33]
        at com.opensymphony.xwork2.inject.ContainerImpl$6.call(ContainerImpl.java:503) ~[struts2-core-2.5.33.jar:2.5.33]
        at com.opensymphony.xwork2.inject.ContainerImpl.callInContext(ContainerImpl.java:558) ~[struts2-core-2.5.33.jar:2.5.33]
        at com.opensymphony.xwork2.inject.ContainerImpl.inject(ContainerImpl.java:503) ~[struts2-core-2.5.33.jar:2.5.33]
        at org.apache.struts2.views.jsp.ComponentTagSupport.doStartTag(ComponentTagSupport.java:48) ~[struts2-core-2.5.33.jar:2.5.33]
        at org.apache.jsp.WEB_002dINF.jsp.layout.sftaLayoutNoTitle_jsp._jspx_meth_s_005fhead_005f0(xLayoutNoTitle_jsp.java:423) ~[?:?]
        at org.apache.jsp.WEB_002dINF.jsp.layout.sftaLayoutNoTitle_jsp._jspService(xLayoutNoTitle_jsp.java:192) ~[?:?]
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) ~[jasper.jar:9.0.84]

深入研究似乎存在问题的 JSP,错误似乎发生在该 JSP 中遇到“”标记的位置。我已经检查了所有依赖的 JAR,但我根本没有看到问题,我想知道是否有其他人看到过这个。我目前的想法是,要么我的某个依赖项的版本太旧,要么我完全错过了某个依赖项。我目前拥有的 JAR 包括:

struts2-core-2.5.33.jar

struts2-spring-plugin-2.5.33.jar

struts2-tiles-plugin-2.5.33.jar

tiles-api-3.0.8.jar

tiles-autotag-core-runtime-1.2.jar

tiles-core-3.0.8.jar

tiles-el-3.0.8.jar

tiles-freemarker-3.0.8.jar

tiles-jsp-3.0.8.jar

tiles-ognl-3.0.8.jar

tiles-request-api-1.0.7.jar

tiles-request-freemarker-1.0.7.jar

tiles-request-jsp-1.0.7.jar

tiles-request-servlet-1.0.7.jar

tiles-servlet-3.0.8.jar

tiles-template-3.0.8.jar

顺便说一下,作为测试,我尝试使用 2.5.30(即从原来的 2.5.29 上升了一步),问题也在那里发生;看来问题是由该版本中发生的事情引起的,而不是 2.5.33 中发生的事情引起的。

我所点击的初始 URL 的 Struts 配置没有 Action 方法 - 它只是直接转到呈现 JSP 的 Tiles 定义。在 2.5.29 中,它工作得很好。在 2.5.30 及更高版本中,出现 500 错误。我已经研究了大约六个小时,但我被难住了。

dependency-injection struts2 runtime-error upgrade
1个回答
0
投票

您的界面有问题

NotExcludedAcceptedPatternsChecker
。 Struts 容器错过了从
struts2-core-2.5.3x
中包含的配置进行初始化。由于您手动管理依赖项,因此这是一种容易出错的方法。这些 bean 在
struts-default.xml
中配置,并包含在
struts2-core-2.5.3x.jar
中。你是对的,新的接口和实现类是从 Struts 2.5.30 开始出现的。但是您的应用程序以某种方式使用可能来自不同版本的同一 jar 的旧配置文件。看起来在部署应用程序时,这两个 jar 都在类路径中找到。

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