Java Struts2自定义例外应用接收器
我已经在这里和网上搜索过了,但我找不到解决问题的方法 我想使用我的自定义异常处理程序截获所有Java异常,并以特定的方式处理它们(我将把特定的状态设置为响应,然后在通用Ajax错误中:调用将处理它们,并创建带有特定消息的JS对话框) 所以我创造了我的行动: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
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>