service抛异常给controller,@controlleradvice处理service层异常

  service抛异常给controller,@controlleradvice处理service层异常

  

目录

服务层中的控制器异常处理和事务控制控制器层异常事务回滚失败问题Spring的@Transactional源代码说测试测试测试测试

 

  00-1010最近写代码涉及到一些事务。早上终于把代码弄清楚了。之前不知道在哪里做异常处理,导致代码到处试捕,比较难看。

  或者基于控制器-服务-dao三层写代码。从入口来说,控制器层的方法对应的是某个url,是给应用人员的,应该返回他们能读取的信息,所以控制器必须做异常处理。一般来说,会有统一的异常处理方法;

  服务层是针对控制器的,服务层中的一些方法必须保证它们的事务,所以在服务层进行事务控制是相当必要的。对于多个sql片段,如果一个sql的执行失败,则应该回滚已执行的sql语句。

  Dao层更多的是单一的sql语句,不需要事务控制,因为事务开销不便宜(官方话);

  基于以上三点,后面再考虑异常处理。一般来说,异常应该在线抛出,直到最后的处理层。所以其实不需要对dao层和服务进行try-catch,只需抛出异常即可。

  相应的,就是spring的交易配置。默认情况下,spring只回滚运行时异常。如果异常是在dao层中处理的,那么在spring回滚异常之前需要进行额外的配置。常用的配置是@ transactional(roll back for=exception . class)

  对了,一个java知识点,关于try-catch-finally中finally的作用,最后设计了关闭资源。如果在finally中使用return语句,它将覆盖try或catch的返回值。最常见的就是覆盖异常,即使catch向上抛出异常,也会被覆盖,finally中return语句的返回值也会被返回。

  

controller异常处理及service层的事务控制

 

  

controller层Exception异常事务回滚失效问题

默认情况下,事务将在{ @ link RuntimeException }和{@link Error}上回滚,但不会在已检查的异常(业务异常)上回滚。

 

  默认情况下,如果事务中抛出未检查的异常(从RuntimeException继承的异常)或错误,Spring将回滚事务;此外,Spring不回滚事务。

  00-1010只有在发生未捕获的RuntimeException时,默认的spring事务才会回滚。

  //测试回滚成功案例,基于IllegalArgumentException(Runtime Exception)@ get mapping(/Test success )@ Transactional//如果不添加,public r Test success(@ request param( type )integer类型){ edu teacherservice . remove byid( 2 )不会回滚;if(type==1){ throw new IllegalArgumentException(测试回滚成功案例!);} edutecherservice . remove byid( 3 );返回r . ok();}

  

Spring的@Transactional源码中写道

异常异常,事务回滚失败;

 

  //测试回滚失败案例,基于异常实现回滚;@ get mapping(/test fail )@ Transactionalpublic R test fail(@ request param( type )Integer类型){ try { edutecherservice . remove byid( 2 );If (type==1){抛出新异常(测试回滚失败案例!);} edutecherservice . remove byid( 3 );} catch(Exception e){ e . printstacktrace();}返回r . ok();}

  00-1010使用回滚解决异常,无需事务回滚

  roll back for=Exception . class throws Exception @ get mapping(/testFailRollbackFor )//Configure roll back for @ transactional(propagation=propagation . required,roll back for=Exception . class)public R testFailRollbackFor(@ request param( type )Integer类型)throws Exception { edu teacherservice . remove byid( 2 );If (type==1){ throw new Exception(测试回滚失败回滚成功案例!);} edutecherservice . remove byid( 3 );返回r . ok();}

  00-1010手动回滚解决异常,但不进行事务回滚

  catch:事务SPECT支持。当前事务状态().setrollbackonly();@ get apping(/test ucces byhand )@ transaction public r test ucces byhand(@ request param( type )integer type){ try { educaterservice。remove byid(“2”);if (type==1){抛出新异常(鲁仲文鲁仲文鲁仲文我的天);} educaterservice。remove byid(“3”);} catch(异常e){ e . print stack trace();//唉哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟是吗?唉呀sql2()阿云娥,sql1()哎哎哎是吗?你是说.事务光谱支持。当前事务状态().setrollbackonly();}返回r . ok();}

  云娥与云娥同在是吗?吴惠玲?吴惠玲是吗?吴亚玲吴亚玲吴亚玲是吗?

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: