当前位置: 首页 > news >正文

Java程序设计:spring boot(13)——全局异常与事务控制

1 Spring Boot 事务支持

       在使⽤ Jdbc 作为数据库访问技术时,Spring Boot框架定义了基于jdbc的PlatformTransaction Manager 接⼝的实现 DataSourceTransactionManager,并在 Spring Boot 应⽤ 启动时⾃动进⾏配置。如果使⽤ jpa 的话 Spring Boot 同样提供了对应实现。

       这⾥ Spring Boot 集成了 mybatis 框架,mybatis 底层数据访问层实现基于 jdbc 来实现,所以在 Spring Boot 环境下对事务进⾏控制,事务实现由 Spring Boot 实现并⾃动配置,在使⽤时通过注解⽅ 式标注相关⽅法加⼊事务控制即可。

声明式事务配置:

@Transactional(propagation = Propagation.REQUIRED)
public void saveUser(User user) {AssertUtil.isTrue(StringUtils.isBlank(user.getUserName()), "⽤户名不能为空!");AssertUtil.isTrue(StringUtils.isBlank(user.getUserPwd()),"⽤户密码不能为空!");User temp = userMapper.queryUserByUserName(user.getUserName());AssertUtil.isTrue(null != temp, "该⽤户已存在!");AssertUtil.isTrue(userMapper.save(user)<1,"⽤户记录添加失败!");
}
@Transactional(propagation = Propagation.REQUIRED)
public void updateUser(User user) {AssertUtil.isTrue(StringUtils.isBlank(user.getUserName()), "⽤户名不能为空!");AssertUtil.isTrue(StringUtils.isBlank(user.getUserPwd()),"⽤户密码不能为空!");User temp = userMapper.queryUserByUserName(user.getUserName());AssertUtil.isTrue(null != temp && !(temp.getId().equals(user.getId())), "该⽤
户已存在!");AssertUtil.isTrue(userMapper.update(user)<1,"⽤户记录添加失败!");
}
@Transactional(propagation = Propagation.REQUIRED)
public void deleteUser(Integer id){AssertUtil.isTrue(null == id || null ==userMapper.queryById(id),"待删除记录不存
在!");AssertUtil.isTrue(userMapper.delete(id)<1,"⽤户删除失败!");
}

2 Spring Boot 全局异常处理

       SpringMvc 中对异常统⼀处理提供了相应处理⽅式,推荐⼤家使⽤的是实现接⼝ Handler ExceptionResolver的⽅式,对代码侵⼊性较⼩。

       在Spring Boot 应⽤中同样提供了对异常的全局性处理,相关注解如下。

2.1 @ControllerAdvice

       该注解组合了 @Component 注解功能,最常⽤的就是作为全局异常处理的切⾯类,同时通过该注解 可以指定包扫描的范围。@ControllerAdvice 约定了⼏种可⾏的返回值,如果是直接返回 model 类的 话,需要使⽤@ResponseBody 进⾏ json 转换。

2.2 @ExceptionHandler

       该注解在 Spring 3.X 版本引⼊,在处理异常时标注在⽅法级别,代表当前⽅法处理的异常类型有哪些 具体应⽤以 Restful 接⼝为例,测试保存⽤户接⼝。

2.3 全局异常应用

2.3.1 异常抛出与全局异常捕获

UserController 查询接⼝:

@ApiOperation(value = "根据⽤户id查询⽤户记录")
@ApiImplicitParam(name = "userId",value = "⽤户ID",required = true, paramType =
"path")
@GetMapping("user/id/{userId}")
public User queryUserByUserId(@PathVariable Integer userId){return userService.queryUserByUserId(userId);
}

UserService 查询业务⽅法,抛出 ParamExceptions 异常:

public User queryUserByUserId(Integer userId){// 抛出异常AssertUtil.isTrue(true,"异常测试...");return userMapper.queryById(userId);
}

全局异常处理类 GlobalExceptionHandler 定义:

@ControllerAdvice
public class GlobalExceptionHandler{/*** 全局异常处理 返回json* @param e* @return*/@ExceptionHandler(value = Exception.class)@ResponseBodypublic ResultInfo exceptionHandler(Exception e){ResultInfo resultInfo = new ResultInfo();resultInfo.setCode(300);resultInfo.setMsg("操作失败!");if(e instanceof ParamsException){ParamsException pe = (ParamsException) e;resultInfo.setMsg(pe.getMsg());resultInfo.setCode(pe.getCode());}return resultInfo;}
}

Postman 执⾏测试效果:

2.3.2 特定异常处理

通过 @ExceptionHandler 标注⽅法处理特定异常,这⾥以⽤户未登录异常为例,通过全局异常进 ⾏统⼀处理:

/*** ⽤户未登录异常特殊处理 返回json* @param authExceptions* @return*/
@ExceptionHandler(value = NoLoginException.class)
@ResponseBody
public ResultInfo userNotLoginHandler(NoLoginException authExceptions){System.out.println("⽤户未登录异常处理。。。");ResultInfo resultInfo = new ResultInfo();resultInfo.setCode(authExceptions.getCode());resultInfo.setMsg(authExceptions.getMsg());return resultInfo;
}

在⽤户修改接⼝中抛出未登录异常为例进⾏测试:

/*** 修改⽤户* @param user* @return*/
@ApiOperation(value = "更新⽤户")
@ApiImplicitParam(name = "user", value = "⽤户对象")
@PostMapping("/user")
public ResultInfo updateUser(@RequestBody User user) {if(1 == 1){throw new NoLoginException();}ResultInfo resultInfo = new ResultInfo();userService.updateUser(user);return resultInfo;
}

Postman 执⾏测试效果:

相关文章:

Java程序设计:spring boot(13)——全局异常与事务控制

1 Spring Boot 事务支持 在使⽤ Jdbc 作为数据库访问技术时&#xff0c;Spring Boot框架定义了基于jdbc的PlatformTransaction Manager 接⼝的实现 DataSourceTransactionManager&#xff0c;并在 Spring Boot 应⽤ 启动时⾃动进⾏配置。如果使⽤ jpa 的话 Spring Boot 同样提供…...

金和OA-C6 ApproveRemindSetExec.aspx XXE漏洞复现(CNVD-2024-40568)

0x01 产品描述&#xff1a; 金和C6协同管理平台是以"精确管理思想"为灵魂&#xff0c;围绕“企业协同四层次理论”模型&#xff0c;并紧紧抓住现代企业管理的六个核心要素&#xff1a;文化 Culture、 沟通Communication 、 协作Collaboration 、创新 Creation、 控制…...

Redis集群及Redis存储原理

Redis存储原理 Redis将内存划分为16384个区域(类似hash槽) 将数据的key使用CRC16算法计算出一个值,取余16384 得到的结果是0~16383 将这个key保存在计算结果对应的槽位 再次查询这个key时,直接到这个槽位查找,效率很高 实际上这就是"散列表" 提高查询的效率 R…...

基于Springboot的图书个性化推荐系统【源码】+【论文】

图书个性化推荐系统是一个基于Java语言和Springboot框架开发的Web应用系统&#xff0c;主要为管理员和学生提供个性化图书推荐、图书预约和管理功能。系统通过管理员和学生的不同权限设置&#xff0c;实现了图书分类管理、预约管理、退换图书管理、留言板管理等全面的功能&…...

科普 | 子母钟系统是什么?网络时钟同步的重要性?

科普 | 子母钟系统是什么&#xff1f;网络时钟同步的重要性&#xff1f; 科普 | 子母钟系统是什么&#xff1f;网络时钟同步的重要性&#xff1f; 在信息时代的今天&#xff0c;准确统一的时钟系统已广泛的应用在车站、医院、学校、机场等公共服务场所。 因此完善的时钟系统对…...

批量删除redis数据【亲测可用】

文章目录 引言I redis客户端基础操作key的命名规则批量查询keyII 批量删除key使用连接工具进行分组shell脚本示例其他方法III 知识扩展:控制短信验证码获取频率引言 批量删除redis数据的应用: 例如缓存数据使用了新的key存储,需要删除废弃的key。RedisTemplate的key序列化采…...

Vuestic 数据表格 使用demo

<template><br><div class"grid sm:grid-cols-3 gap-6 mb-6"><VaButton click"()>{for(const it in this.selectedItems){console.log(this.selectedItems);}}">参数设置</VaButton><VaButton>参数刷新</VaButt…...

考勤无忧,Zoho People助HR高效

云考勤系统提升数据准确性、无缝对接业务、节省成本、提高员工效率、保障安全。ZohoPeople作为云HRMS&#xff0c;集成考勤管理等功能&#xff0c;支持试用&#xff0c;助力企业高效管理。 一、使用云考勤管理系统&#xff0c;有哪些好处&#xff1f; 1、数据准确性得到保障 …...

已知一个法向量和一个点,求该平面的ModelCoefficients,并使用ProjectInliers将点云投影到该平面

#include <pcl/point_cloud.h> #include <pcl/point_types.h> #include <pcl/filters/project_inliers.h> #include <pcl/model_coefficients.h>// 假设法向量和一个点已知 float A 1.0; // 法向量的 x 分量 float B 0.0; // 法向量的 y 分量 floa…...

92.【C语言】数据结构之单向链表的查找,中间插入和删除,销毁

目录 1.链表的查找函数 2.链表的修改函数 3.链表的中间插入函数 1.在pos之前插入:SLTInsertBefore函数 1.借助头指针pphead 示意图 代码示例(写入SList.c) 头文件添加SLTInsertbefore的声明 main.c的部分代码改为 1.测试中间插入 2.测试头部插入 3.测试pos为NULL的…...

WPF+MVVM案例实战(七)- 系统初始化界面字体描边效果实现

文章目录 1、案例效果展示2、项目准备3、功能实现1、资源获取2、界面代码3、后台代码4 源代码获取1、案例效果展示 2、项目准备 打开项目 Wpf_Examples,新建系统初始化界面 WelcomeWindow.xmal,如下所示: 3、功能实现 1、资源获取 案例中使用的CSDN文字为路径文字,从字体…...

基于 C# 的 AI 算法测试方法

基于 C# 的 AI 算法测试方法 在当今人工智能蓬勃发展的时代&#xff0c;AI 算法的质量和可靠性至关重要。对于使用 C# 开发的 AI 算法&#xff0c;我们需要一套有效的测试方法来确保其性能、准确性和稳定性。本文将详细探讨基于 C# 的 AI 算法测试方法&#xff0c;帮助开发者更…...

Find My画框|苹果Find My技术与画框结合,智能防丢,全球定位

画框通常用于保护和固定艺术品&#xff0c;尤其是绘画作品。它是一种可以展示艺术品的框架&#xff0c;用于保护艺术品免受损坏或污染。艺术品被放置在画框内&#xff0c;可以避免受到空气、尘土和其他外部因素的损害。同时&#xff0c;画框还可以增强艺术品的展示效果&#xf…...

布谷语音源码服务器搭建环境及配置流程

布谷语音源码部署环境安装要求&#xff08;只有在相同的环境下才更容易避免一些不必要的麻烦&#xff09;&#xff1a;●安装Center OS 7.9&#xff0c;我们自己的服务器使用的是7.9建议相同系统&#xff0c;非强制●安装宝塔环境&#xff08;强烈推荐使用&#xff09;●安装软…...

算法|牛客网华为机试21-30C++

牛客网华为机试 上篇&#xff1a;算法|牛客网华为机试10-20C 文章目录 HJ21 简单密码HJ22 汽水瓶HJ23 删除字符串中出现次数最少的字符HJ24 合唱队HJ25 数据分类处理HJ26 字符串排序HJ27 查找兄弟单词HJ28 素数伴侣HJ29 字符串加解密HJ30 字符串合并处理 HJ21 简单密码 题目描…...

Tomcat servlet response关于中文乱码的经验

前言 最近修改老项目项目&#xff0c;使用zuul网关返回的中文内容乱码了&#xff0c;如果使用GBK或者GB2312编码确正常显示&#xff0c;稍微实验了一下&#xff0c;发现里面很多细节&#xff0c;毕竟Springboot对我们做了很多事情&#xff0c;而且当我们使用不同的模式会出现很…...

WebGIS开发丨从入门到进阶,全系列课程分享

WebGIS开发所需的技能 1.前端技能&#xff1a;Html、CSS、 Javascript、WebAPLs、Vue 2.二维技能&#xff1a;WebGIS基础理论及开发、MapGIS二次开发Openlayers、Leaflet、Mapbox 、Echarts、公共开发平台开发等 3.三维技能&#xff1a;Blender、Three.js、Cesium等 Web开发…...

C++ 模板专题 - 标签分派(Tag Dispatching)

一&#xff1a;概述: 在 C 中&#xff0c;Tag Dispatching 是一种编程技巧&#xff0c;主要用于在编译期根据不同的类型或特征选择不同的函数重载或代码分支。Tag Dispatching 借助类型标签&#xff08;tags&#xff09;进行函数调度&#xff0c;用于在模板中实现编译期的静态分…...

如何解决RabbitMQ消息的重复消费问题

什么情况下会导致消息的重复消费——在消费者还没成功发送自动确认机制时发生&#xff1a; 网络抖动消费者挂了 解决方案 每条消息设置一个唯一的标识id幂等方案&#xff1a;【Redis分布式锁、数据库锁&#xff08;悲观锁、乐观锁&#xff09;】 面试官&#xff1a;如何解决…...

Java调用chatgpt

目前openai的chatgpt在国内使用有一定难度&#xff0c;不过国内的大模型在大部分情况下已经不弱于chatgpt&#xff0c;而且还更便宜&#xff0c;又能解决国内最敏感的内容安全问题。本文后续以spring ai调用国内chatgpt厂商实现为例&#xff0c;讲解怎么构建一个java调用chatgp…...

3分钟免费实现Figma界面中文本地化:设计师的终极语言解决方案

3分钟免费实现Figma界面中文本地化&#xff1a;设计师的终极语言解决方案 【免费下载链接】figmaCN 中文 Figma 插件&#xff0c;设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma的英文界面烦恼吗&#xff1f;每天花费大量时间在菜…...

保姆级教程:用唯创知音WT588F02B语音芯片,从录音到烧录完整走一遍

零基础实战&#xff1a;WT588F02B语音芯片从录音到播放全流程解析 第一次接触语音芯片开发时&#xff0c;我被WT588F02B的易用性惊艳到了——不需要复杂的编程&#xff0c;只需准备好音频文件就能实现语音播放功能。但实际操作中&#xff0c;从录音到最终烧录成功&#xff0c;每…...

知网AIGC检测算法升级后怎么降AI率?2026最新降AI率方法全面解读

知网AIGC检测算法升级后怎么降AI率&#xff1f;2026最新降AI率方法全面解读 前两天我室友拿着检测报告差点哭了——明明自己一个字一个字敲的论文&#xff0c;知网AI率居然标了38%。她当时整个人都懵了&#xff0c;因为上个月同专业的师姐用差不多的写法&#xff0c;AI率才12%就…...

CasRel关系抽取实战:对接Airflow构建SPO抽取ETL调度流水线

CasRel关系抽取实战&#xff1a;对接Airflow构建SPO抽取ETL调度流水线 1. 项目背景与价值 在日常业务中&#xff0c;我们经常需要从大量文本数据中提取结构化信息。比如从新闻文章中提取人物关系&#xff0c;从产品描述中提取规格参数&#xff0c;从客服对话中提取用户诉求等…...

火狐浏览器与Chrome浏览器:隐私保护与性能优化的深度较量

1. 浏览器江湖的双雄对决&#xff1a;为什么这场较量值得关注 每天打开电脑第一件事是什么&#xff1f;对大多数人来说&#xff0c;肯定是启动浏览器。作为互联网世界的入口&#xff0c;浏览器承载着我们工作、学习、娱乐的方方面面。在众多浏览器中&#xff0c;火狐&#xff0…...

XUnity.AutoTranslator技术指南:从入门到精通的游戏翻译解决方案

XUnity.AutoTranslator技术指南&#xff1a;从入门到精通的游戏翻译解决方案 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 一、核心价值&#xff1a;打破语言壁垒的游戏翻译引擎 &#x1f680; 在全球…...

ElasticSearch数据可视化实战:用Kibana快速构建你的第一个Dashboard

ElasticSearch数据可视化实战&#xff1a;用Kibana快速构建你的第一个Dashboard 当你面对海量的ElasticSearch数据时&#xff0c;如何快速提取有价值的信息并直观呈现&#xff1f;Kibana作为Elastic Stack中的可视化利器&#xff0c;能够将复杂的数据转化为一目了然的图表和仪表…...

ZPL文件操作避坑指南:从OPEN到CLOSE的5个常见错误排查

ZPL文件操作避坑指南&#xff1a;从OPEN到CLOSE的5个常见错误排查 在光学设计领域&#xff0c;ZPL宏作为ZEMAX的自动化利器&#xff0c;文件操作是绕不开的核心技能。但当你从教程里的完美示例转向真实项目时&#xff0c;那些被刻意简化的场景往往会暴露出各种"坑"。…...

工业设计必看:SolidWorks曲面建模中的NURBS核心原理与7个避坑指南(2024版)

工业设计进阶&#xff1a;SolidWorks曲面建模中的NURBS核心原理与高阶实践&#xff08;2024版&#xff09; 在汽车外壳的流线型曲面或消费电子产品的有机形态背后&#xff0c;NURBS&#xff08;非均匀有理B样条&#xff09;技术始终是工业设计软件的核心引擎。作为SolidWorks等…...

工业质检新突破:如何用GLAD扩散模型实现高精度无监督异常检测(附MVTec-AD实测)

工业质检革命&#xff1a;GLAD扩散模型如何重塑无监督缺陷检测 在制造业智能化转型浪潮中&#xff0c;工业质检环节正经历着从人工目检到AI视觉的范式转移。传统基于规则或监督学习的检测系统面临标注成本高、泛化能力弱等痛点&#xff0c;而无监督异常检测技术凭借"零样本…...