controller的异常处理以及service层的事务控制___controller层 trycatch不影响service层抛出的异常
controller的异常处理以及service层的事务控制
最近写代码涉及到一些事务,上午终于把代码给理顺了,之前不太清楚在哪里做异常处理,导致代码遍地try-catch,相当难看。
还是基于controller-service-dao三层来写代码,从入口开始,controller层的方法对应的是某个url,面向的是应用人员,应该返回他们能读懂的信息,所以controller必须做异常处理,一般来说会有统一的异常处理方法;
service层面向的是controller,service层中的某些方法,必须保证其事务,所以在service层进行事务控制是相当必要的,对于多条sql进行事务控制,如果某个sql执行失败,那么应当对已经执行的sql语句进行回滚;
dao层更多是单一的sql语句,没有必要进行事务控制,因为事务开销并不便宜(官方原话);
基于以上三点,回头再思考关于异常的处理,一般情况应该把异常网上抛,一直抛到最终处理的那一层,所以对于dao层和service其实是没有必要进行try-catch的,直接往上抛异常就可以。
与之对应的,是spring的事务配置,默认情况下,spring只对运行时异常进行回滚,如果在dao层处理了异常,那么需要进行额外的配置,spring才会对异常进行回滚,常用的配置是@Transactional(rollbackFor=Exception.class)
顺便提一个java知识点,关于try-catch-finally中,finally的作用,finally设计之初就是为了关闭资源,如果在finally中使用return语句,会覆盖try或者catch的返回值,最常见的就是覆盖异常,即便catch往上抛了异常,也会被覆盖,返回finally中return语句的返回值。
service事务抛错回滚后,controller在调用该service处会抛出异常吗?在controller做了异常的处理的情况下,该异常会到controller来么?
因为controller层调用了service层的业务逻辑,因此service出错controller必将联动报错。
service将异常抛给controller层,controller做异常捕捉并能够进行处理。
controller层 trycatch不影响service层抛出的异常
1.controller层 trycatch不影响service层抛出的异常 因为 service层利用spring
的aop控制异常, 而controller层 try catch 不影响, aop完成之后,才会到controller层,所以不影响,但如果在service try catch 一定要抛出异常 否则 不回滚, @Transactional(rollbackFor = Exception.class) 加这个 不仅仅是RuntimeException
一般Service层怎么向Controller层传递业务处理结果呢?
有个疑问想问问大家,就是关于Java三层框架层之间返回业务结果如何处理比较好,以及异常一般怎么处理
比如,
我service层处理逻辑,有四种情况,这种时候我该怎么给controller层返回处理结果?
还有就是.如果我service层发生了异常,比如数据库异常啦,文件读写异常这些,我应该直接在service层catch处理,还是直接抛出到controller层再catch…
我之前也写过一个在service层catch异常,然后封装为自定义异常再抛出到controller的.但是这样处理程序逻辑感觉也不是特别好…
第一个问题,如何返回多种情况传递给controller,这个不是很简单吗,方法是有返回值的啊,主要是你返回值的数据结构是否合适,你可以用枚举,可以用map,可以是集合,可以自己封装dto(data transfer object)
第二个问题,如何处理异常呢,最好不要在service层进行try catch,因为现在基本上都是在service层作业务处理,事务会配置在这一层,try catch会导致事务无法回滚,当然你也可以try catch,但是一定要抛出runTimeException才可以回滚事务。最好的做法是在controller层使用aop进行try catch统一管理
一个关于service层抛异常,controller处理的问题
往数据库插入数据,由于service抛异常,虽然事务回滚了,但是程序已经不能在执行下去了,那么我在controller的处理没了用处,页面正等着controller的返回结果呢,也没了。难道要我在controller手动 try…cathch吗?那也太麻烦了。
我说得清楚点:controller等着service的返回结果封装返回结果集,页面等着对结果集处理,然后进行下一步操作。现在service崩了,一条线都崩了。难道只能在controller手动try…catch,然后在catch里封装另一个返回结果集吗?
spring有统一的异常处理,封装统一的错误返回
controller的异常处理以及service层的事务控制___controller层 trycatch不影响service层抛出的异常相关推荐
- Spring事务抛出Exception异常不回滚
今天有个业务逻辑流程为: 1.访客预约确认先更新预约状态为"预约确认" 2.调用http接口发短信.更新预约状态为"预约成功"等一系列操作 这里面有个问题,如果 ...
- 实现一个输入程序,接收从 键盘读入的字符串。当字符串中所含字符个数少于程序设定的上限时,输出这个字符串;否则抛出MyStringException1异常,在异常处理中要求重新输入新的字符串或者中断程序
实现一个输入程序,接收从 键盘读入的字符串.当字符串中所含字符个数少于程序设定的上限时,输出这个字符串:否则抛出MyStringException1异常,在异常处理中要求重新输入新的字符串或者中断程序 ...
- java中在方法体内抛出异常_Java异常处理中___用于方法体内,抛出一个异常对象。...
Java异常处理中___用于方法体内,抛出一个异常对象. 答: throw; 智慧职教: 运输高致病性动物病原微生物菌(毒)种或者样本的,与内包装要求错误的是 答:E.主容器表面标注"高致病 ...
- java抛异常 代替返回_请问业务层方法是抛出一个异常好还是返回一个结果更好...
@Override public Response checkUserToken(long uid, String accessToken, String deviceToken){ Response ...
- java 如何捕获线程中的异常处理_如何捕获Java中另一个线程抛出的异常?
参见英文答案 > How to catch an Exception from a thread 14个 我正在使用一个创建 ...
- Spring——DAO层、Spring JDBC、Spring事务控制
目录 一.Spring对持久层技术支持 1.Spring支持的持久层技术 2.Spring JDBC 2.1. JDBCTemplate类 2.2.Spring JDBC CRUD操作 2.3.Spr ...
- SpringBoot中Service层事务控制
SpringBoot中使用事务比较简单,在Application启动类上添加@EnableTransactionManagement注解,然后在service层的方法上添加@Transactional ...
- Spring中的事务控制
Chapter 1. Spring中的事务控制(Transacion Management with Spring) Table of Contents 1.1. 有关事务(Transaction)的 ...
- Spring中的事务控制(Transacion Management with Spring)
1.1. 有关事务(Transaction)的楔子 1.1.1. 认识事务本身1.1.2. 初识事务家族成员 1.2. 群雄逐鹿下的Java事务管理 1.2.1. Java平台的局部事务支持1.2.2 ...
最新文章
- mysql事务四个安全级别_四个MySQL事务隔离级别的详细说明
- datagrid如何获取一行数据中的某个字段值_redis 所支持的数据类型以及其应用场景...
- Python自学之乐-Python字典实现简单的三级菜单
- linux tomcat 日志乱码,Linux下TOMCAT中日志出现中文乱码
- 练习作品13:电子试卷自动生成软件
- 提高国内访问GitHub速度的9种方案~
- 没有理智的欲望会走向毁灭,没有欲望的理智会永守清贫
- 【LeetCode】3月31日打卡-Day16-数组排序算法汇总
- vue项目:this.function()中关于:this指针失效的问题
- @Configuration和@Bean注解详解
- Nodejs中puppeteer通过Event抓取HAR数据
- select语句一些要点(一)
- 每次获取不同的图片按顺序从1-xxx
- DirectUI的初步分析-转
- 关于UCINET软件使用计算密度的笔记
- sysdig_Sysdig: 系统故障排查利器
- C语言中free函数如何确定释放的空间大小
- js小技巧:根据身份证号,获取身份信息。如性别、生日、年龄
- 第二十二届全国青少年信息学奥林匹克联赛初赛
- 读书 | 互联网思维到底是什么
热门文章
- oracle基本的操作命令,oracle命令基本操作
- 操作系统文件分配策略_操作系统中的文件分配方法
- Java StreamTokenizer nextToken()方法与示例
- linux判断内存并释放,linux 内存清理/释放命令
- mysql gtid配置_mysql 5.7 GTID主从配置
- 计算机毕业设计谢辞怎么写,毕业论文谢辞怎么写(通用8篇)
- java dataset redis,利用Spring-Data-Redis和Jedis操作Redis缓存
- 清除缓存 c语言_如何用C语言设置,清除和切换单个位?
- 网页如何做到适应在手机上浏览
- docker安装nginx并配置SSL到个人博客