自定义异常拦截器ExceptionInterceptor,继承jfinal的接口,实现全部controller里的方法,如果出异常,返回到页面可以统一处理显示或者记录日志。
代码如下: 相当于将拦截的方法都try catch起来,在catch实现记录日志或统一返回一个错误页面等等需求。
jfinal的主配置如下:配了事务和自定义拦截器
测试页面点请求来到对应controller的service的方法(方法名都一样是saveRoleMenu),按照事务拦截器的正则匹配,执行该方法是已经加了事务管理的。
在这个saveRoleMenu方法中间故意抛了个异常,因为配置了ExceptionInterceptor异常拦截器,所以执行到
int i=Integer.parseInt(err);
时,出现的number异常就会被自己自定义的拦截器给catch掉了。这样就导致事务管理因为没有catch到异常,因此就不会回滚第一条update语句的操作。
所以存在一个问题,假设方法又要支持事务管理,然后又想自定义一个全局异常拦截器用来友好处理异常,不产生新异常或者往外抛的情况下,就不知道怎么处理好了。
测试了如果是往外抛或类似用renderError方法抛一个新异常,这样事务才能回滚。
interceptor.add(...) 这个方法本应该不存在,只是为了兼容历史版本才没有去掉
所以解决办法就很清楚了:将你代码中的 interceptor.addGlobalActionInterceptor(...) 与 interceptor.add(...) 这两行代码交换下位置即可
原因是拦截器的拦截是有先后次序的,先添加的先拦截,所以你的事务拦截器应该放在后面去,这样才能让回滚出于内层,内层再抛出异常时,正好是外层你希望的 ExceptionInterceptor 接手