项目启动报:com.opensymphony.xwork2.config.ConfigurationException: Unable to load configuration.

本文介绍了一个关于Struts2框架配置错误的问题及其解决方案。主要问题是由于在struts.xml文件中配置的动作类名称不完整导致的。通过修正动作类名称,成功解决了启动项目时报出的配置异常。

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

<span style="font-family: Arial, Helvetica, sans-serif;">使用struts2实现上传下载的项目,写完后启动项目报:</span>
com.opensymphony.xwork2.config.ConfigurationException: Unable to load configuration.
	at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:70) ~[xwork-core-2.3.30.jar:2.3.30]
	at org.apache.struts2.dispatcher.Dispatcher.getContainer(Dispatcher.java:970) ~[struts2-core-2.3.30.jar:2.3.30]
	at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:438) ~[struts2-core-2.3.30.jar:2.3.30]
	at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:482) [struts2-core-2.3.30.jar:2.3.30]
	at org.apache.struts2.dispatcher.ng.InitOperations.initDispatcher(InitOperations.java:74) [struts2-core-2.3.30.jar:2.3.30]
	at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepareAndExecuteFilter.java:57) [struts2-core-2.3.30.jar:2.3.30]
	at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:277) [catalina.jar:7.0.30]
	at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:258) [catalina.jar:7.0.30]
	at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:382) [catalina.jar:7.0.30]
	at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:103) [catalina.jar:7.0.30]
	at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4650) [catalina.jar:7.0.30]
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5306) [catalina.jar:7.0.30]
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [catalina.jar:7.0.30]
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901) [catalina.jar:7.0.30]
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877) [catalina.jar:7.0.30]
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:618) [catalina.jar:7.0.30]
	at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1100) [catalina.jar:7.0.30]
	at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1618) [catalina.jar:7.0.30]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) [?:1.7.0_76]
	at java.util.concurrent.FutureTask.run(FutureTask.java:262) [?:1.7.0_76]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [?:1.7.0_76]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [?:1.7.0_76]
	at java.lang.Thread.run(Thread.java:745) [?:1.7.0_76]
Caused by: com.opensymphony.xwork2.config.ConfigurationException: Action class [com.lihf.action] not found
	at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.verifyAction(XmlConfigurationProvider.java:486) ~[xwork-core-2.3.30.jar:2.3.30]
	at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addAction(XmlConfigurationProvider.java:429) ~[xwork-core-2.3.30.jar:2.3.30]
	at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addPackage(XmlConfigurationProvider.java:556) ~[xwork-core-2.3.30.jar:2.3.30]
	at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadPackages(XmlConfigurationProvider.java:295) ~[xwork-core-2.3.30.jar:2.3.30]
	at org.apache.struts2.config.StrutsXmlConfigurationProvider.loadPackages(StrutsXmlConfigurationProvider.java:112) ~[struts2-core-2.3.30.jar:2.3.30]
	at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:264) ~[xwork-core-2.3.30.jar:2.3.30]
	at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:67) ~[xwork-core-2.3.30.jar:2.3.30]
	... 22 more
八月 09, 2016 9:34:07 上午 org.apache.catalina.core.StandardContext filterStart
严重: Exception starting filter struts2
Unable to load configuration. - action - file:/D:/forwork/workspace/.metadata/.me_tcat7/webapps/scxz/WEB-INF/classes/struts.xml:12:50
	at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:496)
	at org.apache.struts2.dispatcher.ng.InitOperations.initDispatcher(InitOperations.java:74)
	at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepareAndExecuteFilter.java:57)
	at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:277)
	at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:258)
	at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:382)
	at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:103)
	at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4650)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5306)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:618)
	at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1100)
	at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1618)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
	at java.util.concurrent.FutureTask.run(FutureTask.java:262)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:745)
Caused by: Unable to load configuration. - action - file:/D:/forwork/workspace/.metadata/.me_tcat7/webapps/scxz/WEB-INF/classes/struts.xml:12:50
	at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:70)
	at org.apache.struts2.dispatcher.Dispatcher.getContainer(Dispatcher.java:970)
	at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:438)
	at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:482)
	... 19 more
Caused by: Action class [com.lihf.action] not found - action - file:/D:/forwork/workspace/.metadata/.me_tcat7/webapps/scxz/WEB-INF/classes/struts.xml:12:50
	at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.verifyAction(XmlConfigurationProvider.java:486)
	at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addAction(XmlConfigurationProvider.java:429)
	at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addPackage(XmlConfigurationProvider.java:556)
	at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadPackages(XmlConfigurationProvider.java:295)
	at org.apache.struts2.config.StrutsXmlConfigurationProvider.loadPackages(StrutsXmlConfigurationProvider.java:112)
	at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:264)
	at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:67)
	... 22 more
原因是我在编写struts.xml的时候少写了action的名字<action name="upload" class="com.lihf.action">正确写法应该是:

<action name="upload" class="com.lihf.action.FileUploadAction">

希望对你们有帮助!


<think>好的,我现在需要帮助用户解决Struts2中出现的com.opensymphony.xwork2.config.ConfigurationException错误,特别是当方法checkToken被定义为动作方法时的问题。首先,我得仔细分析用户提供的错误信息和引用内容,找出可能的原因和解决方案。 首先,用户提到了错误信息显示没有找到对应的Action,比如引用[1]中的错误,提示在命名空间[/]下没有名为AjaxDemo01的Action。这可能是因为在struts.xml中未正确配置该Action,或者命名空间不匹配。同样,引用[2]提到父包未定义,可能是在配置文件中没有正确继承struts-default,或者包名拼写错误。引用[3]和[4]中的错误可能与action的name属性或类配置有关,比如action的name是否包含“.action”后缀,或者class属性是否正确指向了实际的类。 现在用户的问题是当方法checkToken被定义为动作方法时出现ConfigurationException。根据Struts2的机制,动作方法需要在struts.xml中正确配置,或者通过约定(如方法名前缀)自动映射。可能的情况是,checkToken方法没有被正确配置为动作方法,或者配置中存在语法错误。 接下来,我需要考虑可能的原因: 1. **未在struts.xml中配置方法**:如果用户使用动态方法调用或在配置中指定了方法名,但没有正确配置,会导致找不到对应的Action方法。比如,如果action配置中没有指定method属性,或者通配符配置不正确。 2. **方法名不符合约定**:Struts2默认允许通过action的name和方法名组合来调用方法,比如actionName!methodName。如果用户没有启用动态方法调用,或者方法名不符合规范(如没有返回String等),可能导致错误。 3. **包配置错误**:如父包未正确继承struts-default,或者在包中缺少必要的拦截器配置,尤其是当使用token拦截器时,需要正确配置。 4. **方法访问权限问题**:checkToken方法是否为public,是否有正确的返回类型(String),参数是否正确等。 5. **未启用动态方法调用**:在Struts2中,动态方法调用可能需要手动开启,比如在配置文件中设置常量struts.enable.DynamicMethodInvocation为true。 6. **XML语法错误**:struts.xml中的配置可能存在语法错误,如标签未闭合,属性拼写错误等,导致配置文件无法正确加载。 然后,我需要根据这些可能的原因,逐步给出解决方案: 首先,检查struts.xml中的action配置是否正确,特别是是否指定了method属性,或者是否使用了通配符配置。例如: 如果用户想通过URL中的action名称和方法名来调用,如MyAction!checkToken,需要确保动态方法调用已启用,并且在action配置中没有限制方法名。或者,在action中明确配置method属性: <action name="myAction" class="com.example.MyAction" method="checkToken"> <result>/result.jsp</result> </action> 如果checkToken是同一个Action中的不同方法,可能需要使用通配符配置: <action name="*MyAction" class="com.example.MyAction" method="{1}"> <result>/{1}Result.jsp</result> </action> 这样,当访问checkTokenMyAction时,会自动调用checkToken方法。 其次,检查是否在struts.xml中正确继承了struts-default包,并正确配置了拦截器。例如: <package name="default" extends="struts-default"> <!-- 配置action等 --> </package> 如果用户使用了token拦截器来防止重复提交,需要在action中配置对应的拦截器栈,并确保方法名正确。 另外,检查方法是否为public,返回类型是否正确,是否有参数。Struts2的Action方法应该是public,返回String,并且没有参数(或者参数正确处理)。 还要检查struts.xml是否存在语法错误,比如未闭合的标签,错误的属性名等。例如,引用[3]中的action name包含了“.action”后缀,这在Struts2中通常不需要,因为后缀已经在常量中配置(如.action或空),可能导致无法正确映射。 最后,建议用户查看完整的异常堆栈,确定错误发生的具体位置,比如是在加载配置文件时出错,还是在运行时找不到Action或方法。同时,检查项目依赖的Struts2库版本是否一致,避免版本冲突导致的问题。 总结解决方案的步骤: 1. 检查struts.xml中的action配置,确保method属性正确或使用通配符。 2. 确认包配置正确继承struts-default,避免父包未定义。 3. 确保动态方法调用已启用(如果需要)。 4. 检查方法签名是否为public且返回String。 5. 验证XML配置文件的语法正确性。 6. 检查拦截器配置,特别是使用token拦截器时。 7. 确保类路径和包名正确,没有拼写错误。</think>### 解决 `com.opensymphony.xwork2.config.ConfigurationException` 错误的方法 当在 Struts2 中定义 `checkToken` 为动作方法时出现 `ConfigurationException`,通常是由于**配置缺失或方法定义不符合规范**导致。以下是逐步解决方案: --- #### **1. 检查 Action 方法的定义** Struts2 要求动作方法必须满足以下条件: - **方法权限**:`public` - **返回值类型**:`String`(或特定类型,但需与结果映射匹配) - **参数列表**:无参数或参数能被框架自动注入 示例代码: ```java public class TokenAction extends ActionSupport { public String checkToken() { // 必须是 public 且返回 String // 业务逻辑 return SUCCESS; } } ``` --- #### **2. 正确配置 `struts.xml`** 在 `struts.xml` 中,需显式配置动作与方法的映射关系,或通过**通配符**简化配置。 - **方案一:直接指定方法名** ```xml <action name="tokenAction" class="com.example.TokenAction" method="checkToken"> <result>/result.jsp</result> </action> ``` - **方案二:使用通配符动态映射** ```xml <action name="*Token" class="com.example.TokenAction" method="{1}"> <result>/{1}_result.jsp</result> </action> ``` 此时访问 `/checkTokenToken` 会自动调用 `checkToken` 方法[^1]。 --- #### **3. 确保包继承 `struts-default`** 若错误提示 `Parent package is not defined: struts_default`,需在包的配置中继承框架默认包: ```xml <package name="custom-package" extends="struts-default"> <!-- 配置 Action 和拦截器 --> </package> ``` --- #### **4. 启用动态方法调用(可选)** 如果未在配置中指定 `method` 属性,需确保动态方法调用已启用: ```xml <constant name="struts.enable.DynamicMethodInvocation" value="true" /> ``` 之后可通过 URL 格式 `actionName!methodName` 调用方法(如 `tokenAction!checkToken`)[^2]。 --- #### **5. 检查 XML 语法错误** 配置文件中需避免以下错误: - **冗余后缀**:`name="useraction_list.action"` 应改为 `name="useraction_list"` - **未闭合标签**:确保 `<action>` 和 `<result>` 标签正确闭合 - **类路径错误**:确认 `class` 属性指向正确的全限定类名[^3] --- #### **6. 验证 Token 拦截器配置** 若 `checkToken` 方法用于防止重复提交,需在动作中配置 `token` 拦截器: ```xml <action name="submitForm" class="com.example.FormAction"> <interceptor-ref name="token"/> <interceptor-ref name="defaultStack"/> <result name="invalid.token">/error.jsp</result> <result>/success.jsp</result> </action> ``` --- ### 总结流程图 ```plaintext 检查方法定义 → 配置struts.xml → 验证包继承 → 启用动态调用(可选) → 检查XML语法 → 配置拦截器 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值