为什么从我的拦截器引发的异常没有被<global-exception-mappings>捕获?</global-exception-mappings>

时间:2014-12-23 14:53:48

标签: exception struts2 struts-config struts2-interceptors struts2-convention-plugin

我有一个自定义拦截器,我从中抛出异常;

运行Interceptor的Action由Convention插件管理;

拦截器引发的异常在struts.xml中为Action运行的包进行全局定义。

结果:异常映射被忽略,我得到了

  

Struts问题报告

     

Struts检测到未处理的异常:

...
     

踪迹

     

java.lang.IllegalArgumentException:我的消息

我想我只是错过了一些愚蠢的事情...我们已经讨论过这个问题in a similar question,但它是否可以或不能清楚以这种方式工作:

struts.xml中

<package name="my-package" namespace="my" extends="struts-default">
    <interceptors>

        <interceptor name="myInterceptor" class="foo.bar.MyInterceptor"/>

        <interceptor-stack name="myStack">
            <interceptor-ref name="myInterceptor"/>
            <interceptor-ref name="defaultStack"/>
        </interceptor-stack>

    </interceptors> 

    <default-interceptor-ref name="myStack"/>

    <global-results>
        <result name="input">/WEB-INF/content/my-input.jsp</result>
        <result name="error">/WEB-INF/content/my-error.jsp</result>
    </global-results>

    <global-exception-mappings>
        <exception-mapping exception="java.lang.IllegalArgumentException" 
                              result="error" />
        <exception-mapping exception="java.lang.Exception" result="error" />
    </global-exception-mappings>    
</package>

动作

@ParentPackage("my-package")
@Namespace("/my/blabla/yadayada")
public class MyAction extends MyBaseAction {

}

拦截

@Override
public String intercept(ActionInvocation actionInvocation) throws Exception {
    // ....
    if (somethingWrong) {
        throw new IllegalArgumentException("All work and no play makes Jack a dull boy");
    }
}

我也尝试在抽象的BaseAction中定义全局结果/全局异常映射,或者在物理真实的Action本身中定义,但它们也被忽略了。

有关添加/删除/更改内容的任何想法,以使其正常工作?这不是深奥的东西,这是基本的:|

1 个答案:

答案 0 :(得分:3)

异常映射功能的主要候选者是抛出异常的行为。

Docs

  

异常映射是处理抛出异常的Action类的强大功能。核心思想是可以自动捕获Action方法中抛出的异常并将其映射到预定义的Result。

但拦截器抛出的异常也可以由exception拦截器处理。为了捕获其他拦截器,应将异常exception拦截器定义为堆栈中的第一个拦截器。

来自ExceptionMappingInterceptor javadoc

  

建议您将此拦截器作为堆栈上的第一个拦截器,确保它具有捕获任何异常的完全访问权限,即使是由其他拦截器引起的异常。