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有统一的异常处理,封装统一的错误返回

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555999.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 中判断一个字符串是否包含另外一个字符串的方法

方法一:indexOf(String s) 可以配合indexOf(String s)的使用,如果包含,返回的值是包含该子字符串在父类字符串中起始位置;如果不包含必定全部返回值为-1 public void test02() {String str1"张三";String str2"是…

速看!销冠高效给客户群发消息的秘诀

你是不是也有过这样的疑问:明明都是给客户群发消息,为什么别人的成交率那么高,自己却效果一般呢? 今天就给大家分享销冠常用的高效群发消息秘诀,让大家都能更好地与客户进行沟通,提高成交率! …

不显示_电脑不显示桌面图标怎么办?

在现在这个社会时代中,人们对电脑的使用频率非常的高,电脑可以说已经成为了大家在生活中不可或缺的必备品。但是在使用电脑过程中的时候也都容易出现故障。那么,若碰上 电脑开机后只显示桌面的背景而没有任何程序和应用的情况,莫急…

Xshell 的基本使用

软件长这样 Xshell 链接地址 一、输入 ifconfig 查看 linux ip 地址 二、远程连接服务器 三、测试连接

Java中String类的concat方法___java的String字符串的concat()方法连接字符串和“+“连接字符串解释

Java中String类的concat方法 在了解concat()之前,首先需要明确的是String的两点特殊性。 长度不可变值不可变 这两点从源码中对String的声明可以体现: private final char[] value ;其中final对应值的不可更改的特性&#xff1b…

大于小于优化_架构 - 以MySQL为例,详解数据库索引原理及深度优化

一、摘要本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈…

Xftp 基本使用

vmware tool 安装 连接终端Xshell5_安装vmtools_

MySQL:日期函数、时间函数总结

MySQL 获得当前日期时间 函数 获得当前日期时间(date time)函数:now() mysql> select now();--------------------- | now() | --------------------- | 2008-08-08 22:20:46 | ---------------------获得当前日期时间(date…

Vue 组件的自定义事件

绑定自定义事件 // 第一种方式 <Demo demo"test"/> || <Demo v-on:demo"test"/>// 第二种方式 <Demo ref"demo"/> ... mounted() {this.$refs.xxx.$on(demo, this.test) } // 如果想自定义事件只能触发一次&#xff0c;可以使…

c++byte数组和文件的相互转换_终于!word、excel、ppt文件相互转换技巧来了!

不知道大家在用Office软件的时候&#xff0c;有没有遇到过这样的问题。做了个Word文档总结&#xff0c;却需要转换成PPT上台汇报&#xff1b;做了个Word表格统计&#xff0c;却需要转换成Excel进行分析&#xff1b;做了个Excel图表分析&#xff0c;却需要放到Word或PPT上&#…

全局事件总线 (GlobalEventBus)

一、一种组件间通信的方式&#xff0c;适用于任意组件间通信。 二、建立 bus&#xff1a; Vue.prototype.bus new Vue();三、使用 bus bus 上注册自定义事件 this.bus.$emit(customEvent, params);任意组件监听 this.bus.$on(customEvent, function (params) {console.log…

java多线程之ThreadLoal详解

一、ThreadLocal简介 多线程访问同一个共享变量时特别容易出现并发问题&#xff0c;特别是在多个线程需要对一个共享变量进行写入时。为了保证线程安全&#xff0c;一般使用者在访问共享变量时需要进行适当的同步 同步一般是通过加锁来实现的,但这对用户有一定要求,加重了使用…

python 心电处理包_python 黏包现象及其解决方案

一、数据缓冲区缓冲区(buffer)&#xff0c;它是内存空间的一部分。也就是说&#xff0c;在内存空间中预留了一定的存储空间&#xff0c;这些存储空间用来缓冲输入或输出的数据&#xff0c;这部分预留的空间就叫做缓冲区&#xff0c;显然缓冲区是具有一定大小的。二、为什么要缓…

消息订阅与发布(pubsub)

一、一种组件间通信的方式&#xff0c;适用于任意组件间通信。 二、使用步骤&#xff1a; 安装 pubsub&#xff1a;npm i pubsub-js引入&#xff1a;import pubsub from pubsub-js接收数据&#xff1a;A组件想接收数据&#xff0c;则在A组件中订阅消息&#xff0c;订阅的回调在…

JVM经典五十问

文章目录1.什么是JVM?内存管理2.能说一下JVM的内存区域吗&#xff1f;3.说一下JDK1.6、1.7、1.8内存区域的变化&#xff1f;4.为什么使用元空间替代永久代作为方法区的实现&#xff1f;5.对象创建的过程了解吗&#xff1f;6.什么是指针碰撞&#xff1f;什么是空闲列表&#xf…

增量更新同步_OneDrive增量更新功能正式推出 仅同步文件更改部分降低网络占用...

微软的云存储应用OneDrive目前用户量还是蛮多的&#xff0c;不过在功能更新方面OneDrive动作相对来说还是有些慢的。比如非常实用的增量更新功能直到最近微软才正式推出&#xff0c;现在所有个人和企业级用户都可以使用增量更新功能喽。增量更新功能还是有网友在 2014 年向微软…

Vue.$nextTick

一、语法&#xff1a;this.$nextTick(回调) 二、在下一次 DOM 更新结束后执行其指定的回调函数 三、啥时候调用&#xff1a;当改变数据后&#xff0c;要基于更新后的新 DOM 进行某些操作时&#xff0c;要在 nextTick 所指定的回调函数中执行

div靠边隐藏_css如何隐藏div不占位置?

display 属性依照词义真正隐藏元素。将 display 属性设为 none 确保元素不可见并且连盒模型也不生成。使用这个属性&#xff0c;被隐藏的元素不占据任何空间。一旦 display 设为 none 任何对该元素直接打用户交互操作都不可能生效。此外&#xff0c;读屏软件也不会读到元素的内…

MySQL:错误代码1215 无法添加外键约束的解决思路

环境说明: ※MySQL ver:5.7 当你需要添加外键约束的时候,却发现mysql报了个1215错误,一脸懵逼的找到这个博客,那你的问题可能就会得到解决. 解决思路 1.检查两个字段的数据类型是否一致 2.检查两个字段的数据长度是否一致(有时候不指定int长度,长度是10,有时候是11&#xff0…

Vue 封装的过渡与动画

一、作用&#xff1a;在插入、更新或移除DOM元素时&#xff0c;在合适的时候给元素添加样式类名 二、图示 三、写法&#xff1a; 元素进入的样式 v-enter | v-enter-active | v-enter-to元素离开的样式 v-leave | v-leave-active | v-leave-to使用 transition 包裹要过渡的元…