【问题标题】:Why the Exception raised from my Interceptor is not caught by <global-exception-mappings>?为什么我的拦截器引发的异常没有被 <global-exception-mappings> 捕获?
【发布时间】:2014-12-23 14:53:47
【问题描述】:

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

运行 Interceptor 的 Action(s) 由 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 本身中定义全局结果/全局异常映射,但它们也被忽略了。

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

【问题讨论】:

  • 2.3.16.3(由于与 struts2-jquery 插件 3.7.1 不兼容,无法更新到 2.3.20...然后等待 4.0.0)
  • 所以没有任何方法可以将拦截器返回的异常映射到已知结果?我可以从拦截器返回一个结果,但它不会再与项目配置分离......如果我返回一个异常,它可以被映射或不被映射(因此被显示为美化或原始),而如果我返回一个结果它应该在配置中定义...顺便说一句,将其添加为答案,以便我可以投票并(很可能)接受
  • 离题:...与 struts2-jquery 插件 3.7.1 不兼容 你知道吗?我刚刚升级了一个具有一些 s2-jqr 功能的应用程序,它似乎工作正常......现在。 ;)
  • 我想到了,但我还没试过……我现在正在做。
  • 我不经常使用 s2-jqr 插件,所以我不能确定所有功能都正常工作,但日期选择器和对话框都很好。 另外关于 2.3.20 的更新和这个问题,请参阅 issues.apache.org/jira/browse/WW-4433。祝你更新顺利。

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


【解决方案1】:

异常映射功能的主要候选者是引发异常的操作。

Docs

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

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

来自ExceptionMappingInterceptorjavadoc

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

【讨论】:

  • 它把我的拦截器放在第二个,在exception拦截器之后。谢谢!
猜你喜欢
  • 2010-11-16
  • 2012-01-22
  • 1970-01-01
  • 2020-11-16
  • 2010-11-25
  • 2012-02-24
  • 2017-06-18
相关资源
最近更新 更多