Struts2应用程序在添加Interceptor后隐藏了我的异常

时间:2010-11-16 03:17:11

标签: exception-handling struts2 interceptor interceptorstack

所以我有一个我正在研究的S​​truts2应用程序。在我的首页上,我有一个部分将显示我的应用程序抛出的任何异常。这很有效,直到我添加了一个自定义拦截器。

这是我的拦截器代码:

public String intercept(ActionInvocation actionInvocation) throws Exception {

    String result = actionInvocation.invoke();

    return result;
}

这是我的Action类中生成异常的代码,它发生在调用AuthService.Authorize()的位置:

if(AuthService.Authorize(username, password)) {
        if(AuthService.AdminAuthorized()) {
            return "admin";
        }
        return SUCCESS;
    }

这是在AuthService.Authorize()内部,它在访问acc时抛出一个空点异常:

try {
            acc = profileRepository.WhereSingle("Username", "=", username);
        } catch (Exception e) {
            return false;
        }

        if (acc.Password.equals(password)) {

但是,页面加载时。这不是填充的:

<s:property value="%{exception.message}"/>

我测试了它,如果我只是从Action类中抛出一个异常,它就可以工作了。我没有调用redirectAction或其他任何东西

这是我的所有其他包扩展的默认包定义的顶部

<package name="default" namespace="/" extends="struts-default">

    <!-- Interceptors -->
    <interceptors>
        <interceptor name="conversation" class="global.ConversationInterceptor"/>
        <interceptor-stack name="dils-stack">
            <interceptor-ref name="defaultStack"/>
            <interceptor-ref name="conversation"/>                
        </interceptor-stack>
    </interceptors>

    <default-interceptor-ref name="dils-stack"/>

    <global-results>
        <result name="Exception" >/index.jsp</result>
    </global-results>

    <global-exception-mappings>
        <exception-mapping exception="java.lang.Exception" result="Exception"/>
        <exception-mapping exception="java.lang.NullPointerException" result="Exception"/>
    </global-exception-mappings>

1 个答案:

答案 0 :(得分:1)

如何为该操作定义拦截器堆栈?应首先在堆栈中定义ExceptionMappingInterceptor。你可以从struts.xml发布拦截器堆栈配置吗?你的自定义拦截器不应该干扰(它什么都不做)。

<强>更新

我能够重现这个问题,但无论你有没有你的自定义拦截器,它都会发生。

原因是您正在专门查找异常消息,该消息未设置为自动抛出的NullPointerException(如您的情况)。您可以通过显示堆栈跟踪来确认,例如:%{exceptionStack}

对于%{exception.message}

NullPointerException为空,因此它不显示任何内容。如果您要通过消息(例如throw new RuntimeException("OMG!");)抛出异常,那么您将看到该消息。

另请注意,必须在struts.xml中的特定映射较少之前指定更具体的异常映射。由于NullPointerExceptionException更具体,因此您必须先列出它。请注意,这在您的示例中并不重要,因为它们映射到同一个东西。只要知道你的NPE将映射到第一个条目,而不是第二个条目。