springboot整合全局异常处理

一、项目结构

二、全局异常

(1)启动类

package com.mgx;import com.mgx.common.dto.Result;
import com.mgx.utils.ErrorUtil;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;/*** @author mgx*/
@ControllerAdvice
@MapperScan("com.mgx.mapper")
@SpringBootApplication
public class SpringbootMgxApplication {public static void main(String[] args) {System.out.println("开始启动");SpringApplication.run(SpringbootMgxApplication.class, args);System.out.println("启动成功");}/*** 全局异常处理** @param exception Exception* @return R*/@ExceptionHandler(value = Exception.class)@ResponseBodypublic Result<String> defaultExceptionHandler(Exception exception) {return ErrorUtil.handleException(exception);}}

⚠️注意:@ControllerAdvice是@Controller 的增强版。@ControllerAdvice主要用来处理全局数据,一般搭配@ExceptionHandler、@ModelAttribute以及@InitBinder使用。全局异常处理,将配合@ExceptionHandler定义全局异常捕获机制。

(2)CuzException类

package com.mgx.exception;import com.mgx.common.enums.MsgCode;/*** @author mgx*/
public class CuzException extends RuntimeException {private MsgCode msgCode;@Overridepublic String getMessage() {return msgCode.getMsg();}public CuzException(MsgCode msgCode) {this.msgCode = msgCode;}public MsgCode getMsgCode() {return msgCode;}public void setMsgCode(MsgCode msgCode) {this.msgCode = msgCode;}
}

(3)ErrorUtil

package com.mgx.utils;import com.mgx.common.dto.Result;
import com.mgx.common.enums.MsgCode;
import com.mgx.exception.CuzException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.jdbc.BadSqlGrammarException;
import org.springframework.validation.BindException;
import org.springframework.validation.FieldError;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;
import java.sql.SQLException;
import java.util.Enumeration;/*** @author mgx*/
@Slf4j
public class ErrorUtil {private static Result<String> getParamErrorMessage(MethodArgumentNotValidException e) {//按需重新封装需要返回的错误信息StringBuilder stringBuilder = new StringBuilder();//解析原错误信息,封装后返回,此处返回非法的字段名称,错误信息for (FieldError error : e.getBindingResult().getFieldErrors()) {if (stringBuilder.length() > 1) {stringBuilder.append(";  ");}stringBuilder.append(error.getDefaultMessage());}return Result.failure().code(MsgCode.Code_500.getCode()).message(stringBuilder.toString()).build();}public static Result<String> handleException(Exception exception) {try {// 打印全部异常信息log.error("系统异常:", exception);throw exception;} catch (CuzException e) {MsgCode msgCode = e.getMsgCode();return Result.failure().code(msgCode == null ? MsgCode.Code_500.getCode() : msgCode.getCode()).message(msgCode == null ? e.getMessage() : msgCode.getMsg()).build();} catch (IllegalAccessException e) {return Result.failure().code(MsgCode.Code_503.getCode()).build();} catch (MethodArgumentNotValidException e) {printException();return getParamErrorMessage(e);} catch (HttpMessageNotReadableException e) {printException();return Result.failure().code(MsgCode.Code_2002.getCode()).build();} catch (HttpRequestMethodNotSupportedException e) {return Result.failure().code(MsgCode.Code_2004.getCode()).build();} catch (MissingServletRequestParameterException e) {return Result.failure().code(MsgCode.Code_2003.getCode()).build();} catch (IllegalArgumentException e) {return Result.failure().code(MsgCode.Code_2001.getCode()).build();} catch (BindException e) {return Result.failure().code(MsgCode.Code_500.getCode()).message(e.getAllErrors().get(0).getDefaultMessage()).build();} catch (SQLException | DataIntegrityViolationException | BadSqlGrammarException e) {return Result.failure().code(MsgCode.Code_2005.getCode()).build();} catch (Exception e) {return Result.failure().code(MsgCode.Code_500.getCode()).build();}}private static void printException(){ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();if(attributes == null){return;}HttpServletRequest request = attributes.getRequest();// 记录下请求内容log.error("URL : " + request.getRequestURL().toString());log.error("HTTP_METHOD : " + request.getMethod());log.error("IP : " + request.getRemoteAddr());Enumeration<String> enu = request.getParameterNames();while (enu.hasMoreElements()) {String name = enu.nextElement();log.error("name:{},value:{}", name, request.getParameter(name));}}
}

三、测试

(1)下面的SQL明显是错误的,那么我们调用含该SQL的接口,看会返给我们什么

接口调用测试

(2)没有该数据,接口逻辑中抛异常,看会返给我们什么

接口调用测试

(3)自定义SQL语法错误的全局异常,与返回一致,全局异常处理成功。 

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

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

相关文章

TikTok的全球困境:多国整改对跨境出海的影响

TikTok&#xff08;抖音国际版&#xff09;是一款风靡全球的短视频应用程序&#xff0c;凭借其创新的内容和吸引力&#xff0c;迅速在全球范围内赢得了数以亿计的用户。 然而&#xff0c;近年来&#xff0c;TikTok在多个国家和地区面临了严峻的监管挑战和整改要求&#xff0c;…

Java21的新特性

Java语言特性系列 Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java14的新特性Java15的新特性Java16的新特性Java17的新特性Java18的新特性Java19的新特性Java20的新特性Java21的新特性Java22…

flash attention的CUDA编程和二维线程块实现softmax

本文参考了链接添加链接描述 flash attention介绍 flash attention的介绍可以参考论文:FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness,具体的数学公式参考下面这个图片:其中注意关于矩阵S有两个维度,softmax的操作维度是dim=1,用pytorc…

FireFly PowerBASIC RAD编程,调用PowerBASIC COM对象

一、序言 初步看了看PowerBASIC编程&#xff0c;很类似用VC注册窗体后调用回调函数&#xff0c;先是一个Dialog new&#xff0c;然后添加组件 Control add ......&#xff0c; 然后在处理 Windows MSG和发给组件的消息&#xff0c;这种编程方式和早期DOS 25x80屏幕上编程一样&…

1千听歌猜歌名疯狂猜歌ACCESS\EXCEL数据库

就是从今年开始&#xff0c;各类的“猜”游戏开始火爆&#xff0c;先是猜图&#xff0c;比如看图猜明星、看图猜成语、看图猜电影、看图猜电视剧、看图猜背景、看图猜游戏、看图猜影视人物、看图猜景点等。然后又开始猜音频&#xff0c;猜音频最多的是歌。甚至现在的《一站到底…

Python 数据分析学习路线

Python 数据分析学习路线 第一阶段&#xff1a;Python语言基础第二阶段&#xff1a;数据采集和持久化第三阶段&#xff1a;数据分析第四阶段&#xff1a;数据挖掘与机器学习书籍介绍参与方式 第一阶段&#xff1a;Python语言基础 在学习数据分析之前&#xff0c;首先需要掌握P…

探究Nginx应用场景

1 静态资源 Nginx是一个流行的Web服务器和反向代理服务器&#xff0c;它可以用于托管静态资源。下面是一个简单的案例&#xff0c;展示了如何使用Nginx来提供静态资源。 假设你有一个名为example.com的域名&#xff0c;并且你希望使用Nginx来托管位于/var/www/html目录下的静…

知名IT网站博客园陷入绝境

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 博客园陷入生死存亡的绝境。 5月份知名IT开发者网站发布文章称“博客园网站遇到困难了&#xff1a;寻求捐助”&#xff0c;并开通了捐助渠道。4个月过去了&#xff0c;好像效果并不明显&#xff…

毕业设计|基于stm32单片机的app视频遥控抽水灭火小车设计

基于stm32单片机的app视频遥控抽水灭火水泵小车设计 1、项目简介1.1 系统构成1.2 系统功能 2、部分电路设计2.1 L298N电机驱动电路设计2.2 继电器控制电路设计 3、部分代码展示3.1 小车控制代码3.1 水泵控制代码 4 演示视频及代码资料获取 1、项目简介 视频简介中包含资料http…

iOS 17中的Safari配置文件改变了游戏规则,那么如何设置呢

Safari在iOS 17中最大的升级是浏览配置文件——能够在一个应用程序中创建单独的选项卡和书签组。这些也可以跟随你的iPad和Mac&#xff0c;但在本指南中&#xff0c;我们将向你展示如何使用运行iOS 17的iPhone。 你可能有点困惑&#xff0c;为什么Safari中没有明显的位置可以添…

TouchGFX之自定义控件

在创建应用时&#xff0c;您可能需要TouchGFX中没有包含的控件。在创建应用时&#xff0c;您可能需要TouchGFX中没有包含的控件。但有时此法并不够用&#xff0c;当您需要全面控制帧缓冲时&#xff0c;您需要使用自定义控件法。 TouchGFX Designer目前不支持自定义控件的创建。…

晚上弱光拍照不够清晰,学会这几招画面清晰效果好

很多小伙伴喜欢夜晚拍摄&#xff0c;然而拍摄出来的照片经常画面偏暗甚至模糊不清&#xff0c;这是怎么回事&#xff1f; 弱光环境是很多人都比较头疼的拍摄场合&#xff0c;由于光线弱曝光不好把控&#xff0c;并且还很容易出现细节性问题&#xff0c;想要将照片拍好就非常不…

Cannot read properties of null bug解决方法

项目场景&#xff1a; vue3element plusts。 问题描述 本地运行没有任何错误&#xff0c;在生产环境中&#xff0c;当点击按钮&#xff0c;展示el-dialog时第一次正常&#xff0c;关闭时报错 原因分析&#xff1a; 定位到el-dialog组件&#xff0c;最初认为是dialog中table依…

IPO解读丨Arm破解市场质疑的答案,仍在AI中?

时隔7年&#xff0c;移动设备芯片领域霸主Arm重回二级市场。IPO进程的推进&#xff0c;让这家全球芯片行业的基石公司&#xff0c;不得不面对来自市场的全方位的密集审视。 而从股价来看&#xff0c;投资者对于Arm的态度始终处于摇摆中&#xff0c;从上市首日股价大涨25%&…

黑马JVM总结(七)

&#xff08;1&#xff09;StringTable_编译器优化 “a”“b”对应#4&#xff1a;是去常量池中找ab的这个符号 astore 5&#xff1a;是把这个存入编号为5的局部变量 “ab”对应的指令 #4&#xff0c;跟“a”“b”对应#4下面弄是一样的 在执行s3“ab”这行个代码时&#xf…

全网最详细的自动化测试(Jenkins 篇)

学习 Jenkins 自动化测试的系列文章 Robot Framework 概念Robot Framework 安装Pycharm Robot Framework 环境搭建Robot Framework 介绍Jenkins 自动化测试 1. Robot Framework 概念 Robot Framework是一个基于Python的&#xff0c;可扩展的关键字驱动的自动化测试框架。 …

Shiro 框架基本使用

文章目录 Shiro框架介绍Shiro 基本使用SimpleAccountRealmIniRealmJdbcRealmCustomRealm&#xff08;自定义Realm&#xff09; Shiro框架介绍 Apache Shiro是一个强大且易用的Java安全框架&#xff0c;它执行身份验证、授权、密码和会话管理。Shiro框架通过其三个核心组件&…

微服务是个坏主意吗?

曾几何时&#xff0c;我记得我的手指疯狂地敲打键盘&#xff0c;与庞大而杂乱的代码库搏斗。那是巨石的时代&#xff0c;代码就像古老的城堡一样&#xff0c;由一块块石头砌成一个令人印象深刻的庞然大物。 几年过去了&#xff0c;时代变了。开发人员口中的流行语变成了“微服…

Eclipse如何打开debug变量窗口

今天笔者在使用Eclipse调试的时候&#xff0c;发现没有变量&#xff08;Variables&#xff09;监视窗口&#xff0c;真是头痛得很&#xff0c;最后摸索出一套显示变量窗口的操作如下&#xff1a; 点击other&#xff0c;找到Variables并点击 最后调试代码&#xff0c;调试后如图…

【小知识送书2】从不了解用户画像,到用画像数据赋能业务看这一本书就够了丨《用户画像:平台构建与业务实践》

⭐简单说两句⭐ 作者&#xff1a;后端小知识 CSDN个人主页&#xff1a;后端小知识 &#x1f50e;GZH&#xff1a;后端小知识 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 简单说两句 &#x1f381;本次送书1~3本取决于阅读量&#xff0c;阅…