2009-07-31 4 views
2

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

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

После прочтения этого link я следующее:

<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 (но я не поймать его там) так, наконец, приходит контроль to com.myErrorClass. Я МОЖЕТ записывать ошибки в этом классе, но мой вопрос заключается в том, доступно ли сообщение журнала ... поскольку оно было изначально выбрано в reports.ReportSelection?

ответ

1

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

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

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

6

Вот как вы регистрируете ошибки, которые ваши действия бросают. Я не знаю, почему это не включено по умолчанию. Поместите это в свой файл 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 вокруг каждого метода действий.

0

В качестве альтернативы, вы можете также "перезаписать" стек перехватчиков 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> 
Смежные вопросы