Java Struts2自定义例外应用接收器

Java Struts2自定义例外应用接收器,java,exception,exception-handling,struts2,interceptor,Java,Exception,Exception Handling,Struts2,Interceptor,我已经在这里和网上搜索过了,但我找不到解决问题的方法 我想使用我的自定义异常处理程序截获所有Java异常,并以特定的方式处理它们(我将把特定的状态设置为响应,然后在通用Ajax错误中:调用将处理它们,并创建带有特定消息的JS对话框) 所以我创造了我的行动: public class DefaultExceptionHandlerAction extends ExceptionMappingInterceptor { /** The class logger. */ private stati

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

我想使用我的自定义异常处理程序截获所有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>

由于
defaultStack


dojo\..*、^struts\..*、^session\..*、^request\..*、^application\..*、^servlet(请求|响应)\..*、参数*
输入、返回、取消、浏览
输入、返回、取消、浏览
您基本上包括两个异常拦截器,一个是您编写的,另一个是原始的;他们可能把彼此搞砸了

尝试通过手动插入默认堆栈的拦截器(配置中的第一个异常拦截器除外)来组合堆栈:

 <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>

dojo\..*、^struts\..*、^session\..*、^request\..*、^application\..*、^servlet(请求|响应)\..*、参数*
输入、返回、取消、浏览
输入、返回、取消、浏览

注意:
i18n拦截器
也已经存在了…

undermined是untermined(infinite)的一个拼写错误?现在感谢所有的java异常都被这个拦截器很好地捕捉到了,我的js通过ajax调用了这个动作,它进入了错误:将向用户显示消息的部分。一个问题:如果错误发生在freemarker模板中,我也将进入这个拦截器,但行响应.reset();将引发异常:java.lang.IllegalStateException你知道为什么会发生吗?不知道。。。从未使用过Freemarker,但我不明白“Freemarker模板中出现的错误”是什么意思:/但由于这完全是另一双鞋,我建议您使用Freemarker标签打开一个新问题,以获得正确目标的帮助;)
<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>