Controller的代码如下:
public void index() throws Exception{ render("auth_sign_list1.html"); // 此html不存在 }
由于不存在此html,所有抛出 java.lang.RuntimeException: File not found 异常。
但是在JfinalConfig中已经配置了异常拦截器:
@Override public void configInterceptor(Interceptors me) { me.add(new ExceptionInterceptor("/common/500.html")); }
此拦截器的实现如下:
@Override public void intercept(Invocation ai) { try { ai.invoke(); } catch (Exception e) { logger.error(e.getMessage(),e); Controller controller = ai.getController(); if (RequestKit.isAjaxRequest(controller.getRequest())) { controller.renderJson(Ret.fail("msg","程序内部错误!")); }else { controller.setAttr("msg", e.getMessage()); controller.render(this.render); } } }
但是此异常不会被拦截到?Jfinal中的异常不经过拦截器,是需要在
web.xml 中配置 500 的错误,是吗?如果在web.xml中配置500错误拦截的话,那是不是拦截到的 500.html 无法进行模板引擎操作了
所以这个问题需要通过继承 RenderFactory,并覆盖里头的 getErrorRender(...) 方法去解决,在 getErrorRender 中可以响应自定义的 render ,实现精细化控制
还可以通过配置来解决:
configConstant(Constants me) {
me.setError500View("/common/500.html");
me.setErrorView(404, "/common/404.html");
}