less than 1 minute read

为了解决昨天晚上碰到的 aLock 那个吞 Exception 的问题,下午配了一下 struts 2 的拦截器。

基本的拦截器配置是这个样子的(在 struts.xml 的 <package> 元素内):

<interceptors>
    <interceptor-stack name="xxx">
        <interceptor-ref name="foo"/>
    </interceptor-stack>
</interceptors>
<default-interceptor-ref name="xxx" />

这里 interceptor-ref 既可以是单个拦截器,也可以是一个拦截器栈。struts 2 指定了很多拦截器和拦截器栈的 alias,如果 interceptor-ref 的 name 设置为这些 alias,就表示使用默认的拦截器或者拦截器栈(所以如果自定义拦截器实现的时应该避免这些 alias?)

1. 最开始我只配了一个默认的 exception 拦截器

<interceptor-ref name="exception">
    <param name="logEnabled">true</param>
    <param name="logCategory">com.netease.mail.advlock</param>
    <param name="logLevel">WARN</param>
</interceptor-ref>

表示:

log = LogFactory.getLog(new Category("com.netease.mail.advlock"));
log.warn(exception);

2. 后来发现出现了新的错误

其实是因为 struts 2 有一个默认的拦截器栈的配置 defaultStack,比如 query?key=value 的自动注入(request.getParameter 自动注入到 Action 的同名属性中),就是 defaultStack 中的 params 拦截器实现的。

如果你不写任何拦截器配置,这个 defaultStack 是默认使用的,但如果你写了拦截器配置,就必须指明是否继续使用 defaultStack

所以我改成了:

<interceptor-ref name="defaultStack">
</interceptor-ref>
<interceptor-ref name="exception">
    <param name="logEnabled">true</param>
    <param name="logCategory">com.netease.mail.advlock</param>
    <param name="logLevel">WARN</param>
</interceptor-ref>

3. 但我接着又发现了

defaultStack 其实是包含 exception 拦截器的,只是 exception 的配置不同,上面的配法相当于配置了两个 exception 拦截器。

所以又改成了 “interceptor configuration override” 的写法:

<interceptor-ref name="defaultStack">
    <param name="exception.logEnabled">true</param>
    <param name="exception.logCategory">com.netease.mail.advlock</param>
    <param name="exception.logLevel">WARN</param>
</interceptor-ref>

这下就圆满了~


参考:Interceptor ConfigurationInterceptors

Categories:

Updated:

Comments