如何使用SpringBoot处理全局异常
如何使用SpringBoot处理全局异常
使用@ControllerAdvice 和 @ExceptionHandler处理全局异常
参考:
@ControllerAdvice
@ResponseBody
@Slf4j
public class ExceptionHandler {@ResponseStatus(HttpStatus.OK)@org.springframework.web.bind.annotation.ExceptionHandler(value = {MissingServletRequestParameterException.class})public ViewResult<Object> missingServletRequestParameterException(MissingServletRequestParameterException e) {return ViewResult.state(RpcCode.OPERATION_NOT_PERMITTED_CODE, e.getMessage(), null);}@ResponseStatus(HttpStatus.OK)@org.springframework.web.bind.annotation.ExceptionHandler(value = {Exception.class})public ViewResult<Object> allException(Exception e) {ViewResult<Object> result = buildCustomException(e);if (result == null && e.getCause() != null) {result = buildCustomException(e.getCause() );}if (result != null) {return result;}// 请求传参等spring抛出的异常消息显示出来用于调试if (e instanceof ServletException || e instanceof NestedRuntimeException) {log.warn("", e);return ViewResult.state(RpcCode.SYSTEM_DEFAULT_ERROR_CODE, "请求错误:" + e.getMessage(), null);}log.error("system error:", e);return ViewResult.state(RpcCode.SYSTEM_DEFAULT_ERROR, null);}/*** 自定义异常的统一处理,各异常的message需要是汉字形式的提示文本。* @param e* @return*/private ViewResult<Object> buildCustomException(Throwable e) {int code = RpcCode.SYSTEM_DEFAULT_ERROR_CODE;if (e instanceof NoAuthException) {code = RpcCode.OPERATION_NOT_PERMITTED_CODE;} else if (e instanceof com.chj.thor.auth.v2.exception.NoAuthException) {code = RpcCode.OPERATION_NOT_PERMITTED_CODE;} else if (e instanceof DuplicatedException) {code = RpcCode.RESOURCE_DUPLICATED_CODE;} else if (e instanceof NotFoundException) {code = RpcCode.RESOURCE_NOTFOUND_CODE;} else if (e instanceof OperationNotPermittedException) {code = RpcCode.OPERATION_NOT_PERMITTED_CODE;} else if (e instanceof ParamInvalidException) {code = ApiRpcCode.PARAM_INVALIDATED_CODE;} else if (e instanceof UrlUnreachableException) {code = ApiRpcCode.URL_UNREACHABLE_CODE;} else if (e instanceof ThirdServiceException) {code = ApiRpcCode.THIRD_SERVICE_CODE;} else if (e instanceof ThorException) {code = 500001;}if (code != RpcCode.SYSTEM_DEFAULT_ERROR_CODE) {return ViewResult.state(code, e.getMessage(), null);}return null;}@ResponseStatus(HttpStatus.BAD_REQUEST)@org.springframework.web.bind.annotation.ExceptionHandler({MethodArgumentNotValidException.class,//requestBody校验})public ViewResult<Object> methodArgumentNotValidException(MethodArgumentNotValidException e) throws MethodArgumentNotValidException {log.info("[前置条件校验失败]", e);Class<?> clazz = e.getParameter().getExecutable().getDeclaringClass();//只有Controller层的参数出现问题才进行封装处理,否则直接上抛if (clazz.getSimpleName().endsWith("Controller")) {FieldError fieldError = e.getBindingResult().getFieldError();String message = "INVALID PARAMS";if (null != fieldError) {message += ":" + fieldError.getField();message += ":" + fieldError.getDefaultMessage();}return ViewResult.state(IRpcCode.ILLEGAL_ARGUMENT_CODE, message, null);} else {throw e;}}@ResponseStatus(HttpStatus.BAD_REQUEST)@org.springframework.web.bind.annotation.ExceptionHandler({ConstraintViolationException.class //requestParam校验})public ViewResult<Object> constraintViolationException(ConstraintViolationException e) {log.info("[前置条件校验失败]", e);Set<ConstraintViolation<?>> validations = e.getConstraintViolations();StringBuilder message = new StringBuilder("INVALID PARAMS");//当配置的是failFast模式时,循环只会执行一遍for (ConstraintViolation<?> v : validations) {//只有Controller service层的参数出现问题才进行封装处理,否则直接上抛if (v.getRootBeanClass().getSimpleName().endsWith("Controller") ||v.getRootBeanClass().getSimpleName().endsWith("ServiceImpl")) {message.append(":");message.append(v.getPropertyPath());message.append(":");message.append(v.getMessage());} else {throw e;}}return ViewResult.state(IRpcCode.ILLEGAL_ARGUMENT_CODE, message.toString(), null);}@ResponseStatus(HttpStatus.BAD_REQUEST)@org.springframework.web.bind.annotation.ExceptionHandler({HttpMessageNotReadableException.class, //requestParam校验HttpRequestMethodNotSupportedException.class,//method不支持HttpMediaTypeException.class,//ContentType问题ServletRequestBindingException.class//数据绑定问题})public ViewResult<Object> constraintViolationException(Exception e) {log.info("[客户端数据格式错误]", e);return ViewResult.state(IRpcCode.ILLEGAL_ARGUMENT_CODE, e.getMessage(), null);}}相关文章:
如何使用SpringBoot处理全局异常
如何使用SpringBoot处理全局异常 使用ControllerAdvice 和 ExceptionHandler处理全局异常 参考: ControllerAdvice ResponseBody Slf4j public class ExceptionHandler {ResponseStatus(HttpStatus.OK)org.springframework.web.bind.annotation.ExceptionHandler…...
【2023CANN训练营第二季】——通过一份入门级算子开发代码了解Ascend C算子开发流程
本次博客讲解的代码是Gitee代码仓的Ascend C加法算子开发代码,代码地址为: quick-start 打开Add文件,可以看到文件结构如下: 其中add_custom.cpp是算子开发的核心文件,包括了核函数的实现,展示了如何在Asc…...
建模仿真软件 Comsol Multiphysics mac中文版软件介绍
COMSOL Multiphysics mac是一款全球通用的基于高级数值方法和模拟物理场问题的通用软件,拥有、网格划分、研究和优化、求解器、可视化和后处理、仿真 App等相关功能,轻松实现各个环节的流畅进行,它能够解释耦合或多物理现象。 附加产品扩展了…...
深入理解强化学习——强化学习的历史:近代强化学习的发展
分类目录:《深入理解强化学习》总目录 在《深入理解强化学习——强化学习的历史》前面的文章中我们讨论了最优控制和试错学习学习的思想,接下来,我们将讨论一些在20世纪60年代和70年代,在试错学习计算和理论研究被相对忽视的时候&…...
移动端ViT新利器!苹果提出稀疏专家混合模型Mobile V-MoEs
文章链接:https://arxiv.org/abs/2309.04354 最近,专家混合模型MoE受到了学术界和工业界的广泛关注,其能够对任意输入来激活模型参数中的一小部分来将模型大小与推理效率分离,从而实现模型的轻量化设计。目前MoE已经在自然语言处理…...
【linux系统】服务器安装Pycharm
文章目录 安装pycharm步骤1. 进入pycharm官网2. 上传到服务器3. 安装过程 摘要:pycharm是Python语言的图形化开发工具。因为如果在Linux环境下的Python shell 中直接进行编程,其无法保存与修改,在大型项目当中这是很不方便的,而py…...
便利连锁:如何增加收益?教你一招轻松搞定!
自动售货机,作为零售行业的一项颠覆性技术,正逐渐改变着我们的购物方式和商业格局。这一创新技术不仅重新定义了零售业务模式,还为企业提供了更多的机会来满足不断演变的消费者需求。 客户案例 便利连锁店 成都某便利连锁店面临一系列挑战&am…...
STM32-程序占用内存大小计算
STM32中程序占用内存容量 Keil MDK下Code, RO-data,RW-data,ZI-data这几个段: Code存储程序代码。 RO-data存储const常量和指令。 RW-data存储初始化值不为0的全局变量。 ZI-data存储未初始化的全局变量或初始化值为0的全局变量。 占用的FlashCode RO Data RW Data; 运行消…...
鱼眼图像去畸变python / c++
#鱼眼模型参考链接 本文假设去畸变后的图像与原图大小一样大。由于去畸变后的图像符合针孔投影模型,因此不同的去畸变焦距得到不同的视场大小,且物体的分辨率也不同。可以见上图,当焦距缩小为一半时,相同大小的图像(横…...
文心一言简单体验
百度正式发布文心一言,文心一言 这里的插件模式挺有意思: 测试了一下图解说明,随意上传了一张图片: 提供图解让反过来画,抓住了部分重点,但是还是和原图有比较大的差异! 百宝箱 暂未逐个体验&am…...
css正确的语法
Cascading Style Sheets (CSS) 是一种用于定义网页元素外观和样式的标记语言。以下是正确的 CSS 语法要点: 选择器 (Selector): 选择器用于指定要应用样式的 HTML 元素。例如,选择器可以是标签名、类名、ID、属性等。例如: 标签名选择器&…...
【PG】PostgresSQL角色管理
目录 角色概念 查询现有角色 列出当前角色 创建角色 删除角色 更改角色 创建角色举例 预定义角色 角色属性 登陆角色 超级用户角色 创建数据库角色 创建role角色 复制角色 创建带有密码的角色 角色成员关系 角色组概念 角色组增加成员 角色组移除成员 删除角…...
百度智能云获评Forrester中国市场人工智能/机器学习平台领导者
写在前面百度智能云AI平台,打造企业智能化转型的基础设施大模型时代,百度智能云AI平台迎来全面升级 写在前面 日前,国际权威咨询机构 Forrester 发布了最新的《The Forrester Wave™:中国市场人工智能/机器学习平台厂商评测&…...
基于java+swing+mysql实现的仓库商品管理系统
JavaSwingmysql用户信息管理系统 一、系统介绍二、功能展示三、项目相关3.1 乱码问题3.2 如何将GBK编码系统修改为UTF-8编码的系统? 四、其它1.其他系统实现 五、源码下载 一、系统介绍 本系统实现了两个角色层面的功能,管理员可以管理用户、仓库、商品…...
深入理解Spring Boot AOP:CGLIB代理与JDK动态代理的完全指南
深入理解Spring Boot AOP:CGLIB代理与JDK动态代理的完全指南 前言第一:AOP和代理模式AOP(面向切面编程):代理模式: 第二:深入分析CGLIB代理,包括其实现原理和内部机制CGLIB的实现原理…...
【无标题】读书笔记之《智能化社会:未来人们如何生活、相爱和思考》
《智能化社会:未来人们如何生活、相爱和思考》:Digital vs Human_ how well live, love, and think in the future ,由中信出版社于2017年06月出版。作者是澳大利亚的理查德沃特森(Richard Watson)。Richard Watson在伦敦帝国理工学院从事未来…...
华为云双十一服务器数据中心带宽全动态BGP和静态BGP区别
2023华为云双十一优惠活动中提供多款云服务器选择,需要注意的是:西南-贵阳一和华北-北京一数据中心是静态BGP带宽,其他数据中心配置全动态独享BGP带宽。 静态BGP和全动态BGP带宽有什么区别?全动态BGP网络线路可用性保障更高&…...
STM32 HAL库串口使用printf
STM32 HAL库串口使用printf 背景配置说明在usart.h中添加在usart.c中添加在工程中选中微库: 测试 背景 在我们使用CubeMX生成好STM32 HAL库工程之后,我们想使用printf函数来打印一些信息,配置如下: 配置说明 在usart.h中添加 …...
【VPX610】 青翼科技基于6U VPX总线架构的高性能实时信号处理平台
板卡概述 VPX610是一款基于6U VPX架构的高性能实时信号处理平台,该平台采用2片TI的KeyStone系列多核DSP TMS320C6678作为主处理单元,采用1片Xilinx的Virtex-7系列FPGA XC7VX690T作为协处理单元,具有2个FMC子卡接口,各个处理节点之…...
Parity 战略转型引热议,将如何推动波卡生态去中心化?
Polkadot 生态的区块链基础设施公司 Parity Technologies,最近宣布了一项重要的战略调整,即正在寻求在未来几个月内,将部分现有的市场职能转移给 Polkadot 生态系统内的多个去中心化团队,这将影响 Parity Technologies 未来几个月…...
观察 Taotoken 在多地域请求下的延迟与稳定性表现
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 观察 Taotoken 在多地域请求下的延迟与稳定性表现 对于依赖大模型 API 进行开发的团队而言,服务的延迟与稳定性是影响开…...
Simple Runtime Window Editor:突破游戏窗口限制的终极解决方案
Simple Runtime Window Editor:突破游戏窗口限制的终极解决方案 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE 你是否曾为游戏内置分辨率选项太少而烦恼?是否想在窗口模式下获得全屏游戏…...
OpenCore Legacy Patcher终极指南:5步让老旧Mac完美运行最新macOS系统
OpenCore Legacy Patcher终极指南:5步让老旧Mac完美运行最新macOS系统 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是…...
终极解密指南:Windows平台NCM音频文件一键转换实战
终极解密指南:Windows平台NCM音频文件一键转换实战 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾因网易云音乐的NCM加密格式而烦恼&…...
All in Token,三个运营商建Token工厂,中国移动跟进Token经营 三大运营商争夺AI阵地
随着Token(词元)经营战略的密集落地,三大运营商在AI领域的竞争愈发激烈。在日前举行的2026移动云大会上,中国移动正式发布了Token运营生态体系与移动模型服务平台MoMA,宣布接入超300款模型,并通过Token集约…...
OpenSpire:开源贡献者协作平台的设计理念与实战指南
1. 项目概述:一个面向开源贡献者的协作平台最近在和一些刚接触开源的朋友交流时,发现一个挺普遍的现象:很多人对参与开源项目充满热情,但第一步“如何找到合适的项目并上手”就卡住了。GitHub上项目浩如烟海,一个新手面…...
符号链接批量管理工具 linko:声明式配置与自动化实践
1. 项目概述与核心价值最近在折腾一些自动化脚本和工具链,发现一个挺有意思的仓库:monsterxx03/linko。乍一看这个名字,你可能会有点懵,这到底是干嘛的?是链接管理工具,还是某种网络代理的客户端࿱…...
基于RP2040的客制化宏键盘:从硬件设计到KMK固件开发全攻略
1. 项目概述与核心价值最近在折腾一个挺有意思的开源项目,叫clawdpad,作者是kudretyilmazz。乍一看这个名字,可能有点摸不着头脑,但如果你对机械键盘、客制化输入设备或者桌面自动化感兴趣,那这个项目绝对值得你花时间…...
大语言模型可靠性监测与压缩的谱方法研究
1. 大语言模型可靠性监测与压缩的谱方法研究概述在深度学习领域,大语言模型(LLM)和视觉语言模型(VLM)的可靠性问题与计算效率挑战日益凸显。模型幻觉(生成与输入无关或错误的内容)和分布偏移(面对训练数据分布外的输入时性能下降)会严重损害用户信任,而庞…...
MedAgentBench:大模型临床决策能力评估基准详解与应用
1. 项目概述:当大模型成为医疗决策的“实习生” 最近在医疗AI的圈子里,一个名为“MedAgentBench”的开源项目引起了不小的讨论。这个由斯坦福机器学习组(Stanford ML Group)发布的项目,其核心目标非常明确:…...
