《Spring全局异常处理》从零掌握@ControllerAdvice注解
一、开门见山
在前后端分离框架的大趋势下,前后端基本的职责已经确定。
前端主要负责界面的处理以及基本的判空检验。数据来源则通过vue调用后端发布的接口。
后端的原型还是mvc的模式:
controller |
接受前端请求(entity或者list<entity>),并调用service提供的功能性接口,返回json |
service | 定义接口做实际的业务处理,数据库处理。可以调用微服务接口,可以调用dao层的数据库CURD |
dao | 一般单表操作,利用mybatisplus就可以实现单笔或者批量操作 |
从表格中我们可以看出,service层主要处理业务逻辑,那么就一定会有意想不到的“惊喜”,因此我们一般需要在service层
进行异常处理,并将此异常抛给controller进行处理(因为controller是前后端沟通的桥梁,可以将异常处理后,返回给前端),
就此ControllerAdvice闪亮登场!
二、异常处理流程详解
2.1、定义错误码
路径:i18n/message_zh_CN.properties(国际化文本,此处不做赘述,不懂得尽快去找度娘)
00=操作成功
01=数据库插入数据失败
02=数据库删除数据失败
03=数据库更新数据失败
04=数据库查询数据失败
05=查询结果为空
06=工作流操作失败
07=请求参数异常
08=操作异常
2.2、定义获取中文描述的工具类
@Component
public class MessageUtil { private static MessageSource messageSource; @Autowired
public MessageUtil(MessageSource messageSource) {
messageSource = messageSource;
} public static String get(String msgKey) {
try {
String message = messageSource.getMessage(msgKey, (Object[])null, LocaleContextHolder.getLocale());
return message;
} catch (Exception var2) {
return msgKey;
}
}
}
2.3、定义枚举类进行包装
public enum SCodeEnum {
SUCCESS("00"),
INSERT_ERROR ("01"),
DELETE_ERROR("02"),
UPDATE_ERROR("03"),
SELECT_ERROR("04"),
SELECT_EMPTY("05"),
OPERATE_FLOWABLE_ERROR("06"),
REQUEST_ARGS_ERROR("07"),
OPERATE_EXCEPTION("08");
private String code;
SCodeEnum(String code) {
this.code=code;
}
public String getCode(){
return this.code;
}
}
2.4、错误码与错误信息的获取
//获取错误码
SCodeEnum.SUCCESS //获取错误信息
MessageUtil.get(SCodeEnum.SUCCESS.getCode())
2.5、定义自己的异常处理类(统一抛出此异常)
public class BizException extends Exception { public BizException(SCodeEnum codeEum) {
super(MessageUtil.get(codeEum.getCode()));
super.errorCode = codeEum.getCode();
}
}
2.6、定义全局异常处理类,加上ControllerAdvice
@RestControllerAdvice() //当返回是json的时候,利用RestControllerAdvice,类比RestController
public class SiteExceptionHandler { //自定义异常
@ExceptionHandler(BizException.class)
public Object handleException(HttpServletRequest request, BizException e){
LoggerUtil.error("出现异常======> [{}] ",e);
return SResponseUtil.output(SCodeEnum.OPERATE_EXCEPTION,
MessageUtil.get(SCodeEnum.OPERATE_EXCEPTION.getCode()));
} //spring @Valid判空拦截的异常
@ExceptionHandler(MethodArgumentNotValidException.class)
public Object handleException(HttpServletRequest request, MethodArgumentNotValidException e){
LoggerUtil.error("出现异常======> [{}] ",e);
String message = e.getBindingResult().getAllErrors().stream().findFirst().get().getDefaultMessage();
return SResponseUtil.output(SCodeEnum.REQUEST_ARGS_ERROR, message);
} //当抛出没有拦截的异常的时,就会统一由最高级Exception接管
@ExceptionHandler(Exception.class)
public Object handleException(HttpServletRequest request, Exception e){
LoggerUtil.error("出现异常======> [{}] ",e);
return SResponseUtil.output(SCodeEnum.OPERATE_EXCEPTION,
MessageUtil.get(SCodeEnum.OPERATE_EXCEPTION.getCode()));
}
}
2.7、service层开始抛异常
throw new BizException(codeEum);
三、每日闲暇时光
3.1、新鲜事
高考结束
3.2、歌曲推荐
北京东路的日子,祝愿考生们即将开始新的旅程。
3.3、影视推荐
超时空接触,如果你也是一名喜欢科幻,热爱探索未知的童鞋。
3.4、每日金句
高考,是人生中唯一一次拿起武器为自己战斗的时刻,或许不能决定你的一生,但可以给你一种权利,选择的权力。-魏平涛
3.5、养眼壁纸
妹子虽好看,没有营养快线,切莫贪杯哦
《Spring全局异常处理》从零掌握@ControllerAdvice注解的更多相关文章
- Spring 全局异常处理
[参考文章]:Spring全局异常处理的三种方式 [参考文章]:Spring Boot 系列(八)@ControllerAdvice 拦截异常并统一处理 [参考文章]:@ControllerAdvic ...
- spring mvc异常统一处理(ControllerAdvice注解)
首先我的项目是一个为移动端提供的json数据的,当后台报错时如果为移动端返回一个错误页面显得非常不友好,于是通过ControllerAdvice注解返回json数据. 首先创建一个异常处理类: pac ...
- Spring全局异常处理的三种方式
在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合度高,工作 ...
- Spring全局异常处理
最近学习Spring时,认识到Spring异常处理的强大.之前处理工程异常,代码中最常见的就是try-catch-finally,有时一个try,多个catch,覆盖了核心业务逻辑: 1 try{ 2 ...
- springmvc 全局的异常拦截处理 @ControllerAdvice注解 @ExceptionHandler
第一步: Dispatcher前端控制器的源码中 默认的 private boolean throwExceptionIfNoHandlerFound = false;说明如果没有找到匹配的执行器,不 ...
- spring全局异常处理 自定义返回数据结构
在写api接口中,正常返回和异常错误返回我们都希望很清楚的将这些信息清楚的返回给用户,出现异常情况下需要清楚的知道是参数异常还是未知异常,而不是返回一个不正确的数据结构. 所以此处只针对写api接口时 ...
- SpringBoot学习13:springboot异常处理方式3(使用@ControllerAdvice+@ExceptionHandle注解)
问题:使用@ExceptionHandle注解需要在每一个controller代码里面都添加异常处理,会咋成代码冗余 解决方法:新建一个全局异常处理类,添加@ControllerAdvice注解即可 ...
- SpringBoot: 13.异常处理方式3(使用@ControllerAdvice+@ExceptionHandle注解)(转)
问题:使用@ExceptionHandle注解需要在每一个controller代码里面都添加异常处理,会咋成代码冗余 解决方法:新建一个全局异常处理类,添加@ControllerAdvice注解即可 ...
- Spring Cloud Gateway的全局异常处理
Spring Cloud Gateway中的全局异常处理不能直接用@ControllerAdvice来处理,通过跟踪异常信息的抛出,找到对应的源码,自定义一些处理逻辑来符合业务的需求. 网关都是给接口 ...
随机推荐
- 4k壁纸
4k
- Spring之多数据源切换的应用
这不是一个新的知识点扩展,顶多算是,Spring的AOP特性的一个应用.那么下面开始今天的学习之旅! 场景 数据库读写分离,或者分库,总之多数据源的场景,怎么样实现自动切换(PS:不考虑各种分库分表的 ...
- 关于Integer类的值使用==比较
题记:前几天面试Java基础给来了个面试题Integer a=100,b=100;System.out.println(a==b); 当时回答是true,后来面试官又来了一个Integer a=200 ...
- Unit3-窝窝社交圈
全文共4909字,推荐阅读时间15~20分钟. 文章共分五个部分: JML总结 作业分析 评测相关 重构策略 课程体验感受 JML总结 定义 JML是一种对Java程序进行规格化设计的表示语言 JML ...
- Rigidbody(刚体)方法的初步学习(一)
概要:这次将简单的了解Rigidbody中的各种方法属性,以官方的API为顺序研究. 蛮牛API翻译:Rigidbody组件控制物体的位置—它使物体在重力影响下下落,并可计算物体将怎样响应碰撞.当操作 ...
- Azure Monitor(一)Application Insights
一,引言 Azure Monitor 是 Azure 中的一项完整堆栈监视服务,是一种收集和分析遥测数据的服务.它提供了一组完整的功能来监视 Azure 资源以及其他云中和本地的资源.Azure Mo ...
- MongoDB副本集replica set (二)--副本集环境搭建
(一)主机信息 操作系统版本:centos7 64-bit 数据库版本 :MongoDB 4.2 社区版 ip hostname 192.168.10.41 mongoserver1 192.16 ...
- Maximum Subsequence Sum(java)
7-1 Maximum Subsequence Sum(25 分) Given a sequence of K integers { N1, N2, ..., NK }. A con ...
- dart快速入门教程 (4)
4.流程控制 4.1.分支结构 1.if语句 void main() { int score = 80; if (score >= 90) { print('优秀'); } else if (s ...
- vue基础入门(3)
3.组件基础 3.1.什么是组件? 3.1.1.理解组件 前端组件化开发是目前非常流行的方式,什么是前端组件化开发呢?就是将页面的某一部分独立出来,将这一部分的数据.视图.以及一些控制逻辑封装到一个组 ...