jfinal自定义全局异常拦截器,事务拦截器不能回滚的问题

自定义异常拦截器ExceptionInterceptor,继承jfinal的接口,实现全部controller里的方法,如果出异常,返回到页面可以统一处理显示或者记录日志。

代码如下:  相当于将拦截的方法都try catch起来,在catch实现记录日志或统一返回一个错误页面等等需求。

blob.png

jfinal的主配置如下:配了事务和自定义拦截器blob.png

测试页面点请求来到对应controller的service的方法(方法名都一样是saveRoleMenu),按照事务拦截器的正则匹配,执行该方法是已经加了事务管理的。blob.png

在这个saveRoleMenu方法中间故意抛了个异常,因为配置了ExceptionInterceptor异常拦截器,所以执行到

int i=Integer.parseInt(err);

时,出现的number异常就会被自己自定义的拦截器给catch掉了。这样就导致事务管理因为没有catch到异常,因此就不会回滚第一条update语句的操作。


所以存在一个问题,假设方法又要支持事务管理,然后又想自定义一个全局异常拦截器用来友好处理异常,不产生新异常或者往外抛的情况下,就不知道怎么处理好了。

测试了如果是往外抛或类似用renderError方法抛一个新异常,这样事务才能回滚。blob.png

评论区

JFinal

2018-07-18 16:12

interceptor.add(...) 方法与 interceptor.addGlobalActionInterceptor(...) 这两个方法在功能上是完全一样的

interceptor.add(...) 这个方法本应该不存在,只是为了兼容历史版本才没有去掉

所以解决办法就很清楚了:将你代码中的 interceptor.addGlobalActionInterceptor(...) 与 interceptor.add(...) 这两行代码交换下位置即可

原因是拦截器的拦截是有先后次序的,先添加的先拦截,所以你的事务拦截器应该放在后面去,这样才能让回滚出于内层,内层再抛出异常时,正好是外层你希望的 ExceptionInterceptor 接手

Iwengogo

2018-07-18 16:44

@JFinal 感谢波总指导,换了顺序之后实现效果了。jfinal确实很强大,把spring,mybatis,hibernate,spring mvc,jsp等好多技术的核心功能和思想都简化综合一起了。

JFinal

2018-07-18 17:21

@Iwengogo jfinal 的 sql 管理功能是一大特色,用模板引擎来管理 sql 的方案,直接秒杀掉 mybatis 用 XML 管理 sql 的方案:
http://www.jfinal.com/doc/5-13

热门反馈

扫码入社