2013-06-19 23 views
0

我已經在這裏和互聯網上搜索,但我找不到解決我的問題。Struts2 customExceptionMappingInterceptor

我想使用我的自定義異常處理程序來攔截所有Java異常並以特定方式處理它們(我將設置特定狀態爲響應,然後在通用Ajax錯誤中:調用它們將被處理並JS對話框將用特定的消息創建)。

所以我創造了我的行動:

public class DefaultExceptionHandlerAction extends ExceptionMappingInterceptor { 

/** The class logger. */ 
private static final Logger LOGGER = Logger.getLogger(DefaultExceptionHandlerAction.class); 

@Override 
protected void publishException(ActionInvocation invocation, ExceptionHolder exceptionHolder) { 

    LOGGER.error("Global Exception msg: "+ exceptionHolder.getException().getMessage(), exceptionHolder.getException()); 

    String message = "error msg for client"; 

    HttpServletResponse response = ServletActionContext.getResponse(); 
    response.reset(); 
    response.setStatus(HttpServletResponse.SC_BAD_REQUEST); 

    PrintWriter out = null; 
    try { 
     response.setCharacterEncoding("UTF-8"); 
     out = response.getWriter(); 
     out.print(message); 
    } catch (IOException ioe) { 
     LOGGER.error("IOException in printMessage : " + ioe.getMessage(), ioe); 
    } finally { 
     if (out != null) { 
      out.flush(); 
      out.close(); 
     } 
    } 
} 
} 

在這旁邊,在我struts.xml中我有:

<interceptor name="exception" class="com.travelsoft.orchestra.b2b.configuration.DefaultExceptionHandlerAction" /> 

<interceptor-stack name="securedStack"> 
    <interceptor-ref name="exception" /> 
    <interceptor-ref name="defaultStack" /> 
    <interceptor-ref name="i18n" /> 
    <interceptor-ref name="login" /> 
</interceptor-stack> 

<global-results> 
    <result name="exception">/defaultExceptionHandler.action</result> 
</global-results> 

<global-exception-mappings> 
    <exception-mapping exception="java.lang.Exception" result="exception" /> 
</global-exception-mappings> 

在一個特定的動作,我就直接強迫空指針異常的代碼。 當然,這個動作是使用securedStack攔截器。

當這個動作被執行時,我有不確定的循環。

的javascript:

error : function(jqXHR, textStatus, errorThrown) { 
    // all other errors 
    var contentDialog = $("<div/>",{ "id":"contentDialog"}); 
    contentDialog.html(jqXHR.responseText); 
    contentDialog.dialog({ 
      title : 'Erreur', 
      modal : true, 
      zIndex: 8888, 
      resizable: false, 
      close: function(event, ui) { 
      $(this).dialog("destroy").remove(); 
      }, 
      buttons:{"OK": function() { 
      $(this).dialog("close");}} 
    }); 

},... 
+0

undertermined是錯字(無限)? –

回答

1

由於defaultStackalready contains exception Interceptor

<interceptor-stack name="defaultStack"> 
    <interceptor-ref name="exception"/> 
    <interceptor-ref name="alias"/> 
    <interceptor-ref name="servletConfig"/> 
    <interceptor-ref name="i18n"/> 
    <interceptor-ref name="prepare"/> 
    <interceptor-ref name="chain"/> 
    <interceptor-ref name="scopedModelDriven"/> 
    <interceptor-ref name="modelDriven"/> 
    <interceptor-ref name="fileUpload"/> 
    <interceptor-ref name="checkbox"/> 
    <interceptor-ref name="multiselect"/> 
    <interceptor-ref name="staticParams"/> 
    <interceptor-ref name="actionMappingParams"/> 
    <interceptor-ref name="params"> 
     <param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param> 
    </interceptor-ref> 
    <interceptor-ref name="conversionError"/> 
    <interceptor-ref name="validation"> 
     <param name="excludeMethods">input,back,cancel,browse</param> 
    </interceptor-ref> 
    <interceptor-ref name="workflow"> 
     <param name="excludeMethods">input,back,cancel,browse</param> 
    </interceptor-ref> 
    <interceptor-ref name="debugging"/> 
</interceptor-stack> 

你基本上包括兩個異常攔截,一個是你,原來寫的;他們可能互相混淆了;

<interceptor-stack name="securedStack"> 
    <interceptor-ref name="exception" /> 
     <interceptor-ref name="alias"/> 
     <interceptor-ref name="servletConfig"/> 
     <interceptor-ref name="i18n"/> 
     <interceptor-ref name="prepare"/> 
     <interceptor-ref name="chain"/> 
     <interceptor-ref name="scopedModelDriven"/> 
     <interceptor-ref name="modelDriven"/> 
     <interceptor-ref name="fileUpload"/> 
     <interceptor-ref name="checkbox"/> 
     <interceptor-ref name="multiselect"/> 
     <interceptor-ref name="staticParams"/> 
     <interceptor-ref name="actionMappingParams"/> 
     <interceptor-ref name="params"> 
      <param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param> 
     </interceptor-ref> 
     <interceptor-ref name="conversionError"/> 
     <interceptor-ref name="validation"> 
      <param name="excludeMethods">input,back,cancel,browse</param> 
     </interceptor-ref> 
     <interceptor-ref name="workflow"> 
      <param name="excludeMethods">input,back,cancel,browse</param> 
     </interceptor-ref> 
     <interceptor-ref name="debugging"/> 
    <interceptor-ref name="login" /> 
</interceptor-stack> 

注:

嘗試通過手動插入缺省棧的攔截器只是第一個異常攔截器在配置譜寫自己的堆棧i18n Interceptor已經存在過......

+0

現在感謝這個攔截器很好地捕獲了所有的java異常,並且我通過ajax調用動作的js進入了錯誤:將顯示消息給用戶的錯誤部分。一個問題:如果錯誤發生在freemarker模板中,我也會進入這個攔截器,但是行response.reset();會拋出一個異常:java.lang.IllegalStateException你知道它爲什麼會發生嗎? – gospodin

+0

沒有...從來沒有使用Freemarker,但我不明白「freemarker模板中發生的錯誤」意思是:/但由於它完全是另一雙鞋,我建議你用freemarker標籤打開一個新問題,從正確的目標中獲得幫助;) –