一、开门见山

  在前后端分离框架的大趋势下,前后端基本的职责已经确定。

  前端主要负责界面的处理以及基本的判空检验。数据来源则通过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注解的更多相关文章

  1. Spring 全局异常处理

    [参考文章]:Spring全局异常处理的三种方式 [参考文章]:Spring Boot 系列(八)@ControllerAdvice 拦截异常并统一处理 [参考文章]:@ControllerAdvic ...

  2. spring mvc异常统一处理(ControllerAdvice注解)

    首先我的项目是一个为移动端提供的json数据的,当后台报错时如果为移动端返回一个错误页面显得非常不友好,于是通过ControllerAdvice注解返回json数据. 首先创建一个异常处理类: pac ...

  3. Spring全局异常处理的三种方式

    在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合度高,工作 ...

  4. Spring全局异常处理

    最近学习Spring时,认识到Spring异常处理的强大.之前处理工程异常,代码中最常见的就是try-catch-finally,有时一个try,多个catch,覆盖了核心业务逻辑: 1 try{ 2 ...

  5. springmvc 全局的异常拦截处理 @ControllerAdvice注解 @ExceptionHandler

    第一步: Dispatcher前端控制器的源码中 默认的 private boolean throwExceptionIfNoHandlerFound = false;说明如果没有找到匹配的执行器,不 ...

  6. spring全局异常处理 自定义返回数据结构

    在写api接口中,正常返回和异常错误返回我们都希望很清楚的将这些信息清楚的返回给用户,出现异常情况下需要清楚的知道是参数异常还是未知异常,而不是返回一个不正确的数据结构. 所以此处只针对写api接口时 ...

  7. SpringBoot学习13:springboot异常处理方式3(使用@ControllerAdvice+@ExceptionHandle注解)

    问题:使用@ExceptionHandle注解需要在每一个controller代码里面都添加异常处理,会咋成代码冗余 解决方法:新建一个全局异常处理类,添加@ControllerAdvice注解即可 ...

  8. SpringBoot: 13.异常处理方式3(使用@ControllerAdvice+@ExceptionHandle注解)(转)

    问题:使用@ExceptionHandle注解需要在每一个controller代码里面都添加异常处理,会咋成代码冗余 解决方法:新建一个全局异常处理类,添加@ControllerAdvice注解即可 ...

  9. Spring Cloud Gateway的全局异常处理

    Spring Cloud Gateway中的全局异常处理不能直接用@ControllerAdvice来处理,通过跟踪异常信息的抛出,找到对应的源码,自定义一些处理逻辑来符合业务的需求. 网关都是给接口 ...

随机推荐

  1. 用于实现tab页签切换页面的angular路由复用策略

    使用场景 打开菜单页面的时候,出现对应页面的页签.切换页签,原来的页面信息状态保留,关闭页签则保留的信息删除.使用路由复用策略,保存路由快照.实现效果如图所示 实现过程 概述: 1.在app.modu ...

  2. 使用PyQtGraph绘制图形(1)

    首先利用numpy模块创建两个随机数组,用来作为图形绘制的数据: import pyqtgraph as pg import numpy as np x = np.random.random(50) ...

  3. Tournament Chart【模拟+vector+map+string】

    Tournament Chart 传送门:链接  来源:UPC10889 题目描述 In 21XX, an annual programming contest, Japan Algorithmist ...

  4. c++ vector基本函数、排序、查找用法

    vector用法目录: 1.基本用法 2.vector的删除操作 3.vector的sort排序 4.翻转vector中的所有元素 5.find()函数的用法 6.vector实战(这里写的是我在最开 ...

  5. CentOS安装部署Mysql 5.7

    1,如果没有安装wget,先安装yum -y install wget 2,下载MySQL官方的 Yum Repositorywget http://repo.mysql.com/mysql57-co ...

  6. sorted排序

    sorted(['bob', 'about', 'Zoo', 'Credit']) # ['Credit', 'Zoo', 'about', 'bob'] ''' 默认情况下,对字符串排序,是按照AS ...

  7. delete语句的基本用法

    DELETE FROM tb_courses WHERE course_id=;

  8. mybatis的嵌套查询与嵌套结果查询的不同

    原文:https://blog.csdn.net/qq_39706071/article/details/85156840 实体类: 嵌套查询mapper方法:嵌套查询的弊端:即嵌套查询的N+1问题尽 ...

  9. Rigidbody(刚体)方法的初步学习(一)

    概要:这次将简单的了解Rigidbody中的各种方法属性,以官方的API为顺序研究. 蛮牛API翻译:Rigidbody组件控制物体的位置—它使物体在重力影响下下落,并可计算物体将怎样响应碰撞.当操作 ...

  10. 多语言工作者の十日冲刺<10/10>

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 团队进行Alpha冲刺--第十天(05.09) 作业正文 ...