1

所以我有一个正在开发的 Struts2 应用程序。在我的首页上,我有一个部分将显示我的应用程序抛出的任何异常。在我添加了一个自定义拦截器之前,这很有效。

这是我的拦截器代码:

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>
4

1 回答 1

1

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

更新:

我能够重现此问题,但是无论有没有您的自定义拦截器,它都会发生在我身上。

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

%{exception.message}为 null NullPointerException,因此它不显示任何内容。相反,如果您要抛出带有消息的异常(例如,throw new RuntimeException("OMG!");),那么您将看到该消息。

另外,请注意,您必须在 struts.xml 中的不太具体的映射之前指定更具体的异常映射。因为NullPointerException比 更具体Exception,所以必须先列出。请注意,这在您的示例中并不重要,因为它们映射到同一事物。只要知道您的 NPE 将映射到第一个条目,而不是第二个条目。

于 2010-11-16T05:00:53.813 回答