struts2中报“ Could not find action or result”

本文解决在使用Struts2进行表单校验时遇到的错误信息未在原页面显示的问题,通过调整配置成功将错误信息转发至指定页面。

 

背景:struts2中对从表单输入的内容进行校检,要求错误信息在原页面(表单页面)显示时,会将错误信息默认转发到名为input的result

 

错误如下:警告: Could not find action or result
No result defined for action cn.itcast.Action.PersonAction and result input
 at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:364)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:266)
 at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:252)
 at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
 at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
 at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
 at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:179)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:130)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138)
 at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:165)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:179)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
 at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
 at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
 at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:488)
 at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
 at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
 at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
 at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
 at java.lang.Thread.run(Unknown Source)

 

 

错误根源:<package name="person" namespace="/person" extends="struts-default">
<action name="manage_*" class="cn.itcast.Action.PersonAction" method="{1}">
<result name="message">/WEB-INF/page/message.jsp</result>
</action>
</package>

缺少了一句(加在action中):

<result name="input">/index.jsp</result> 

 

正确写法:

<package name="person" namespace="/person" extends="struts-default">
<action name="manage_*" class="cn.itcast.Action.PersonAction" method="{1}">
<result name="input">/index.jsp</result>
<result name="message">/WEB-INF/page/message.jsp</result>
</action>
</package>

<think>好的,我现在需要解决用户提到的LogConfigurationException异常问题,具体是“Could not find action or result: /sanzi/checkToken.action”在Struts2中的配置问题。首先,我需要回忆一下Struts2的工作原理和相关配置。 根据用户提供的引用信息,尤其是引用[3],问题通常是由于缺少input结果的配置导致的。Struts2在验证失败或某些情况下会默认返回input结果,如果对应的action没有配置input结果的视图,就会抛出这个异常。所以,首先需要检查struts.xml中对应的action是否定义了<result name="input">。 接下来,我需要确认用户提到的路径/sanzi/checkToken.action是否正确映射到了对应的Action类。可能存在拼写错误或包结构不匹配的情况。例如,Action类是否在正确的包下,命名空间是否正确配置。 另外,引用的错误日志显示无法找到actionresult,这可能意味着Struts2的配置文件没有正确加载,或者action的配置有误。比如,action的class属性是否正确指向了实现类,方法是否存在,或者是否有语法错误,如未闭合的标签等。 还需要检查是否有多个struts.xml文件或包含的配置文件,是否存在配置冲突或覆盖的情况。有时候,不同配置文件中的同名action可能会导致预期外的行为。 此外,用户可能没有在action中显式处理input结果,或者没有使用通配符配置结果。例如,使用<result name="input">/error.jsp</result>来指定input对应的页面。如果使用了验证框架,如Validation,验证失败时会自动跳转到input结果,这时候必须配置该结果。 最后,建议用户查看部署后的配置文件是否正确,有时候编译或部署过程中配置文件可能未被正确包含,导致实际运行的配置与源代码不一致。同时,检查日志中的其他错误信息,可能有助于发现更深层次的问题,比如类加载失败或依赖缺失。 总结解决步骤:1. 检查并添加input结果的配置;2. 确认action路径和类配置正确;3. 检查配置文件语法和结构;4. 确保配置文件被正确加载;5. 处理其他可能的依赖或部署问题。</think>### 解决 `LogConfigurationException: Could not find action or result` 的步骤 #### 1. **确认 `struts.xml` 中配置了 `input` 结果** Struts2 在表单验证失败或参数绑定错误时,默认会返回 `input` 结果。如果对应的 Action 未定义该结果,会触发此异常。 **解决方法**: 在对应的 `<action>` 标签内添加 `<result name="input">`,指向错误页面或原表单页面。 ```xml <action name="checkToken" class="com.example.action.CheckTokenAction"> <result name="success">/success.jsp</result> <result name="input">/error.jsp</result> <!-- 必须配置 input 结果 --> </action> ``` 若使用验证框架(如 `validation.xml`),必须配置 `input` 结果[^3]。 --- #### 2. **检查 Action 路径与命名空间配置** 异常中的路径 `/sanzi/checkToken.action` 需与 `struts.xml` 中的 `<package>` 命名空间匹配。 **示例**: ```xml <package name="sanzi" namespace="/sanzi" extends="struts-default"> <action name="checkToken" class="com.example.action.CheckTokenAction"> <!-- 结果配置 --> </action> </package> ``` 若命名空间不匹配(如配置为 `/api`),请求路径需调整为 `/api/checkToken.action`。 --- #### 3. **验证 Action 类与方法是否存在** 确保 `CheckTokenAction` 类存在,且方法签名正确: ```java public class CheckTokenAction extends ActionSupport { public String execute() { // 业务逻辑 return SUCCESS; } } ``` 若方法名非 `execute`,需在 `struts.xml` 中指定 `method` 属性: ```xml <action name="checkToken" class="com.example.action.CheckTokenAction" method="validateToken"> ``` --- #### 4. **排查配置文件加载问题** - **检查 `struts.xml` 是否在类路径下**(如 `src/main/resources`)。 - **确认无语法错误**:如未闭合的标签、错误属性等。 - **多模块配置**:若使用 `<include>` 引入其他配置文件,需确认路径正确。 --- #### 5. **检查依赖与日志** - **依赖冲突**:确保 Struts2 核心库版本一致(如 `struts2-core-2.5.30.jar`)。 - **查看完整日志**:异常可能由深层原因(如类加载失败)引发,需结合其他错误信息分析。 --- #### 配置示例 ```xml <struts> <package name="sanzi" namespace="/sanzi" extends="struts-default"> <action name="checkToken" class="com.example.action.CheckTokenAction"> <result name="success">/token-success.jsp</result> <result name="input">/token-form.jsp</result> <!-- 处理验证错误 --> </action> </package> </struts> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值