2009-07-31 142 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抛出(但我没有抓住它有)所以最后的控制来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>