Dispatcher initialization failed java.lang.RuntimeException: java.lang.reflect.InvocationTargetExcep

本文介绍了如何解决 Struts2 在初始化过程中遇到的 Dispatcher 异常问题,包括核对依赖库、正确配置 web.xml 中的过滤器以及确保引入必要的 jar 包。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

严重: Dispatcher initialization failed java.lang.RuntimeException: java.lang.reflect.InvocationTargetException 问题解决

  5626人阅读  评论(13)  收藏  举报

1、核对lib包

 

commons-fileupload-1.2.1.jar,
commons-io-1.3.2.jar
commons-logging-1.0.4.jar
freemarker-2.3.16.jar
ognl-3.0.jar
struts2-core-2.2.1.jar
xwork-core-2.2.1.jar)

 

注意2.1以前是没有commons-fileupload-1.2.1.jar,

 

2、如果struts2版本是2.1以前

web.xml配置过滤器的时候应该是这样:

[xhtml]  view plain copy
  1. <filter>  
  2.   <filter-name>struts2</filter-name>  
  3.   <filter-class>org.apache.struts2.dispatcher.FilterDispatcher  
  4. </filter-class>  
  5.   </filter>  
  6.   <filter-mapping>  
  7.   <filter-name>struts2</filter-name>  
  8.   <url-pattern>/*</url-pattern>  
  9.   </filter-mapping>  
  10. </web-app>  

如果struts2 版本是2.1以上

web.xml配置

 

[c-sharp]  view plain copy
  1. <filter>  
  2.   <filter-name>struts2</filter-name>  
  3.   <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter  
  4. </filter-class>  
  5.   </filter>  
  6.   <filter-mapping>  
  7.   <filter-name>struts2</filter-name>  
  8.   <url-pattern>/*</url-pattern>  
  9.   </filter-mapping>  
  10. </web-app>  

 

 

3、

在使用struts-2.2.1时,需要引入javassist-3.7.ga.jar,而这个在struts-2.2.1/lib下是没有的,需要在struts-2.2.1/apps/struts2-blank-2.2.1.war下的lib中找。

 

希望大家可以顺利解决。

<think>我们正在处理一个关于Struts 2启动过滤器异常的问题。根据用户描述,错误出现在启动Catalina容器时,涉及ContainerBase.addChild方法,并抛出RuntimeExceptionInvocationTargetException。错误指向ContainerBuilder.java的161行。用户还提供了几个引用,这些引用描述了类似的问题和可能的解决方案。 首先,我们需要分析常见的根本原因: 1. **类加载问题**:如引用[3]中提到的ClassNotFoundException,可能是由于类名配置错误(如filter-class中包含了".class"后缀)或缺少必要的JAR包。 2. **依赖冲突或版本不匹配**:引用[1]提到,如果导入了不需要的插件(如struts2-spring-plugin)而没有使用Spring,可能会导致问题。同时,Struts 2的不同版本对依赖的要求不同,比如在6.4.0中已经集成了XWork,不需要单独的XWork-core。 3. **配置文件错误**:struts.xml、web.xml等配置文件中的错误,如DTD声明不正确(引用[1]提到升级时需要修改DTD版本)或filter配置错误。 4. **项目构建问题**:引用[4]提到,在项目结构中可能存在文件丢失,需要检查并修复。 用户的具体错误信息是: ERROR org.apache.catalina.core.ContainerBase Catalina localhost 启动失败 java.lang.RuntimeException java.lang.reflect.InvocationTargetException at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBuilder.java:161) 这个错误通常发生在Tomcat尝试部署Web应用程序时,在添加子容器(如Context)时失败。根本原因可能隐藏在InvocationTargetException中,我们需要查看更底层的异常。 解决步骤: 1. **检查控制台日志**:查找InvocationTargetException之后的第一个“Caused by”部分,以确定根本原因。可能是缺少类、配置文件错误或初始化失败。 2. **检查web.xml中的过滤器配置**: - 确保`<filter-class>`正确,如引用[3]中提到的,不应该有“.class”后缀。正确的类名是`org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter`(对于Struts 2.5+,包括6.4.0)。注意:在Struts 2.5之前,使用的是`org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter`(注意“ng”),但新版本已经去掉“ng”。 - 示例配置: ```xml <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> ``` 3. **检查依赖**: - 确保项目中只包含必要的Struts 2依赖。对于Struts 2.6+(包括6.4.0),核心依赖是`struts2-core`(Maven坐标:`org.apache.struts:struts2-core:6.4.0`)。 - 检查是否有重复或冲突的依赖(例如,同时存在多个版本的Struts 2核心库或XWork)。 - 移除不必要的插件:例如,如果没有使用Spring,就不要包含`struts2-spring-plugin`;同样,检查其他插件(如JSON插件、JFreeChart插件等)是否与当前版本兼容。 4. **检查配置文件**: - `struts.xml`:确保DTD声明正确(对于Struts 2.5+,应使用2.5的DTD)。同时检查包定义、拦截器配置等。 - 检查是否有多个配置文件冲突(例如,在多个JAR包中包含struts.xml)。 5. **项目结构检查**: - 确保所有依赖的JAR包都放在`WEB-INF/lib`目录下(对于非Maven项目)。 - 如果是使用IDE(如IntelliJ IDEA),检查项目结构(Project Structure)中是否有问题(如引用[4]所述),确保所有模块的依赖正确。 6. **类路径问题**:确保没有重复的类(例如,同一个类出现在多个JAR中)或版本冲突。可以使用`mvn dependency:tree`(Maven项目)来查看依赖树。 7. **日志配置**:增加Struts 2和Tomcat的日志级别(如DEBUG),以获取更详细的错误信息。可以在`struts.xml`中配置: ```xml <constant name="struts.devMode" value="true" /> ``` 由于用户没有提供具体的“Caused by”异常,我们只能根据常见情况给出建议。但是,根据引用[1]和[3]的经验,以下两种可能性较大: 可能性1:过滤器类名配置错误(如引用[3]的情况) - 解决:检查web.xml中的filter-class,确保没有多余的后缀(如“.class”),并且类名完全正确。 可能性2:缺少依赖或依赖冲突(如引用[1]的情况) - 解决:检查是否引入了不必要的插件(如struts2-spring-plugin)而没有配置Spring,或者缺少核心依赖。 如果上述步骤不能解决问题,请用户提供更详细的异常堆栈(特别是“Caused by”部分)。 相关问题: 1. 如何解决Struts 2启动时的ClassNotFoundException? 2. 如何配置Struts 2的web.xml过滤器? 3. 如何排除Struts 2依赖冲突? 4. 如何升级Struts 2到最新版本(6.4.0)? 5. 如何调试Struts 2的启动错误? 注意:在回答中,我们引用了用户提供的引用[1]、[3]和[4],所以我们在适当的地方添加了引用标记。</think>### Struts 2 启动过滤器异常解决方案 当遇到 `ContainerBase.addChild: start` 错误并伴随 `RuntimeException` 和 `InvocationTargetException` 时,通常由以下原因引起。请按顺序排查: #### 1. **检查过滤器类名配置**(最常见错误) 在 `web.xml` 中确认过滤器类名是否正确: ```xml <!-- 正确配置(注意无.class后缀) --> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> ``` - **错误示例**:`org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.class`(多余的后缀)[^3] - **解决方案**:删除类名中的 `.class` 后缀 #### 2. **验证依赖完整性** Struts 6.4.0 核心依赖: ```xml <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>6.4.0</version> </dependency> ``` - **关键检查点**: - 移除所有 `xwork-core*.jar`(6.x 已内置) - 检查是否误添加了不兼容插件(如 `struts2-spring-plugin` 在非Spring项目中)[^1] - 使用命令验证依赖树: ```bash mvn dependency:tree -Dincludes=org.apache.struts ``` #### 3. **配置文件诊断** 在 `struts.xml` 中启用开发模式: ```xml <struts> <constant name="struts.devMode" value="true" /> <constant name="struts.configuration.xml.reload" value="true" /> </struts> ``` - 检查 `struts-default.xml` 加载问题: - 确认 `struts2-core-6.4.0.jar` 中的 `/struts-default.xml` 文件是否完整 - 避免自定义包名与系统包冲突 #### 4. **项目结构修复** 针对 IDE 配置问题: 1. 在 IntelliJ/Eclipse 中检查项目结构: - 确保 `WEB-INF/lib` 包含所有 Struts JAR - 修复 "Problem" 面板中的依赖缺失警告(点击 [Fix] 按钮)[^4] 2. 清理部署缓存: - 删除 `work/Catalina` 和 `temp` 目录(Tomcat) - 执行 `mvn clean install` #### 5. **日志深度分析** 在 `log4j2.xml` 中添加调试配置: ```xml <Configuration> <Loggers> <Logger name="com.opensymphony.xwork2" level="debug" /> <Logger name="org.apache.struts2" level="trace" /> </Loggers> </Configuration> ``` - 关键日志线索: - 查找首个 `Caused by:` 的堆栈跟踪 - 检查 `ClassNotFoundException` 的具体类名 - 关注 `struts-default.xml` 加载过程中的 OGNL 错误 #### 典型错误场景解决 | 错误现象 | 解决方案 | |---------|---------| | `java.lang.ClassNotFoundException: ...StrutsPrepareAndExecuteFilter` | 修正 `web.xml` 的过滤器类名[^3] | | `Caught exception while loading file struts-default.xml` | 移除冲突插件(如 struts2-spring-plugin)[^1] | | `ContainerBase.addChild: start` 无详细错误 | 检查项目依赖完整性[^4] | | OGNL 表达式错误 | 升级至 OGNL 3.3.4(Struts 6.4.0 内置) | > **重要提示**:80% 的启动错误源于 (1) 过滤器类名配置错误 或 (2) 依赖冲突。建议先检查这两个点[^1][^3]。 --- ### 相关问题 1. 如何正确配置 Struts 2.6+ 的过滤器类名? 2. Struts 6.4.0 需要哪些核心依赖项? 3. 如何诊断 `struts-default.xml` 加载失败的根本原因? 4. 解决 Tomcat 部署时 `ContainerBase.addChild` 错误的通用方法? 5. Struts 2 项目从 Tomcat 8 迁移到 Tomcat 10 需要注意什么?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值