我之前有这样一个需求
如果我是ajax请求的话我如果后台报错我返回的是json格式的error
如果我不是ajax请求,是页面跳转submit的方式做提交,后台报错就按正常的跳转到500的报错界面
我的做法是写一个全局拦截器AjaxInterceptor代码如下
public class AjaxInterceptor implements Interceptor {
protected static final Message ERROR_MESSAGE = Message.error("admin.message.error");
public boolean isAjax(Controller controller){
HttpServletRequest request = controller.getRequest();
String requestedWith = request.getHeader("x-requested-with");
if(StrKit.notBlank(requestedWith) && requestedWith.equals("XMLHttpRequest")){
return true;
}
return false;
}
public void intercept(Invocation ai) {
try {
ai.invoke();
} catch (Exception e) {
e.printStackTrace();
if(isAjax(ai.getController())){
ai.getController().renderJson(ERROR_MESSAGE);
}else{
ai.getController().renderError(500);
}
}
}
}作用的如果检查请求头是ajax的我捕获到异常就返回json否则renderError 500
在jfinal3.1的时候我ai.invoke中如果有异常是正常执行的
我上周升级到3.2好像异常不会被我这个拦截器catch到,我怀疑是不是3.2改了action的机制提前把我的异常处理了所以我这边拦截不到了
这里我发现我对java异常处理的基础不好,如果是try catch嵌套的话,是不是最里面的try catch一旦捕获的异常是不会再传递给外层的try catch只会去依次执行外层的finally