Приложение Struts2 скрывает мои исключения после добавления Interceptor - PullRequest
1 голос
/ 16 ноября 2010

Итак, у меня есть приложение 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>

1 Ответ

1 голос
/ 16 ноября 2010

Как определяется ваш стек перехватчиков для этого действия? ExceptionMappingInterceptor должен быть определен первым в стеке. Можете ли вы опубликовать конфигурацию стека перехватчиков из вашего struts.xml? Ваш пользовательский перехватчик не должен мешать (он ничего не делает).

Обновлен:

Мне удалось воспроизвести эту проблему, однако она возникла у меня с вашим пользовательским перехватчиком или без него.

Причина в том, что вы специально ищете сообщение об исключении, которое не установлено для NullPointerException с, которые автоматически выбрасываются (как в вашем случае). Вы можете подтвердить это, отображая трассировку стека, например: %{exceptionStack}

%{exception.message} равно нулю для NullPointerException, и поэтому ничего не отображается. Если вместо этого вам нужно сгенерировать исключение с помощью сообщения (например, throw new RuntimeException("OMG!");), то вы увидите сообщение.

Кроме того, обратите внимание, что вы должны указывать более конкретные сопоставления исключений перед менее конкретными сопоставлениями в вашем struts.xml. Поскольку NullPointerException более конкретно, чем Exception, вы должны сначала перечислить его. Обратите внимание, что это не имеет значения в вашем примере, потому что они отображаются на одно и то же. Просто знайте, что ваш NPE будет соответствовать первой записи, а не второй.

...