Вопрос

Я немного запутался в том, как обрабатывать ошибки в Struts2. Я хотел бы сделать один раз центральную страницу, куда пользователи будут направлены, если произойдет ошибка. Кроме того, когда возникает ошибка, я хочу зарегистрировать ее, так как я использую log4j, я буду регистрировать ее как log.error (e.getMessage (), e);

Однако, в моем классе действий, если я улавливаю ошибку (помещаю весь мой код в try / catch), страница с центральной / общей ошибкой не появляется. Поэтому я решил не отлавливать ошибку, если я не улавливаю ошибку, то появляется центральная страница ошибки. Но теперь, как мне поместить сообщение об ошибке / stacktrack в журналы ??

После прочтения этой ссылки Я сделал следующее:

   <global-results>
                   <result name="Exception" type="chain">
                      <param name="actionName">ErrorPage</param>
                     <param name="namespace">/error</param>

                   </result>
            </global-results>

            <global-exception-mappings>
                <exception-mapping exception="java.lang.Exception" result="Exception"/>
            </global-exception-mappings>
            <action name="selectionPage" class="reports.ReportSelection">
                <result>/reports/SelectionPage.jsp</result>
            </action>

    </package>
    <package name="secure"  namespace="/error">
        <action name="ErrorPage" class="com.myErrorClass">
            <result>errorpage.jsp</result>
        </action>
    </package>

В соответствии с приведенной выше конфигурацией изначально ошибка генерируется в reports.ReportSelection (но я ее там не отлавливаю), поэтому, наконец, элемент управления приходит к com.myErrorClass. Я МОГУ регистрировать ошибки в этом классе, но мой вопрос заключается в том, будет ли сообщение журнала по-прежнему доступно ... так как оно изначально было отправлено в reports.ReportSelection?

Это было полезно?

Решение

После того, как вы поймали и записали его, вы его повторно выводите? Если вы это сделаете, то должно сработать управление исключениями фреймворка. Ваш код обработки ошибок должен выглядеть примерно так:

catch (Exception e) {
    log.error(e.getMessage(), e);
    throw e;
}

Имея это в виду, вы сможете вернуться к своему упрощенному подходу к ведению журнала и повторному отображению его в классе действий и настройке единой страницы глобальной ошибки.

Другие советы

Вот как вы регистрируете ошибки, которые выдают ваши действия. Я не знаю, почему это не включено по умолчанию. Поместите это в свой файл struts.xml.

    <interceptors>
        <interceptor-stack name="errorloggingStack">
          <interceptor-ref name="defaultStack">
           <param name="exception.logEnabled">true</param>
           <param name="exception.logLevel">ERROR</param>
         </interceptor-ref>
        </interceptor-stack>
    </interceptors>

    <default-interceptor-ref name="errorloggingStack"/>

Вам не нужно иметь блоки try-catch вокруг каждого метода действия.

В качестве альтернативы вы также можете "перезаписать" стек перехватчиков defaultStack

<interceptors>
    <interceptor-stack name="defaultStack">
        <interceptor-ref name="defaultStack"/>
        <interceptor-ref name="exception">
            <param name="logEnabled">true</param>
            <param name="logLevel">WARN</param>
        </interceptor-ref>
    </interceptor-stack>
</interceptors>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top