2013-06-19 28 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标签打开一个新问题,从正确的目标中获得帮助;) –