0

我已经在这里和互联网上搜索过,但我找不到解决我的问题的方法。

我想使用我的自定义异常处理程序来拦截所有 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");}}
     });

 },...
4

1 回答 1

1

由于defaultStack 已经包含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也已经存在...

于 2013-06-19T15:26:59.063 回答