Вопрос
Я немного запутался в том, как обрабатывать ошибки в 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>