《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来处理,通过跟踪异常信息的抛出,找到对应的源码,自定义一些处理逻辑来符合业务的需求. 网关都是给接口 ...
随机推荐
- foreach 集合又抛经典异常了,这次一定要刨根问底
一:背景 1. 讲故事 最近同事在写一段业务逻辑的时候,程序跑起来总是报:集合已修改:可能无法执行枚举操作,硬是没有找到什么情况下会导致这个异常产生,就让我来找一下bug,其实这个异常在座的每个程序员 ...
- Elasticsearch原理入门
这是一篇拼接贴,我是缝合怪 项目中用到了es,使用方法是挺简单的,封装了基本api以后,把查询条件封装一下传给client执行就可,但是光使用比较肤浅,研究一下原理和本质,更利于以后开发使用 扫盲贴 ...
- Adobe Photoshop CC 2019 下载+安装教程
1. 安装包 链接: https://pan.baidu.com/s/1_w1SjGVjWNJ9nuTqEcaykg 提取码: xatq 2. 打开安装包 运行Set-up,选择语言,位置 ,选择继续 ...
- 恕我直言你可能真的不会java第2篇:Java Stream API?
一.什么是Java Stream API? Java Stream函数式编程接口最初是在Java 8中引入的,并且与lambda一起成为Java开发的里程碑式的功能特性,它极大的方便了开放人员处理集合 ...
- JavaScript中的事件委托(转至大佬)
转至:https://www.cnblogs.com/liugang-vip/p/5616484.html 起因: 1.这是前端面试的经典题型,要去找工作的小伙伴看看还是有帮助的: 2.其实我一直都没 ...
- rust 宏
macro_rules! four { () => {1 + 3}; } fn main(){ println!("{}", 1+four!()); println!(&qu ...
- 04[掌握] Java连接redis操作
1,Jedis所需要的jar包依赖 <dependency> <groupId>redis.clients</groupId> <artifactId> ...
- 蝙蝠算法(BA)学习笔记
算法原理 蝙蝠能够在夜间或十分昏暗的环境中自由飞翔和准确无误地捕捉食物,是因为他们能够从喉头发出地超声脉冲回声来定位.受这一启发,Yang教授在2010年提出了蝙蝠算法(Bat Algorithm,B ...
- 线性dp 打鼹鼠
鼹鼠是一种很喜欢挖洞的动物,但每过一定的时间,它还是喜欢把头探出到地面上来透透气的.根据这个特点阿Q编写了一个打鼹鼠的游戏:在一个n*n 的网格中,在某些时刻鼹鼠会在某一个网格探出头来透透气.你可以控 ...
- 报错 version `GLIBCXX_3.4.22' not found
from . import pypocketfft as pfft ImportError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GL ...