一、开门见山

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

  前端主要负责界面的处理以及基本的判空检验。数据来源则通过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. @hdu - 6607@ Easy Math Problem

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 求: \[\sum_{i=1}^{n}\sum_{j=1}^{n ...

  2. mermaid使用简介(画论文插图的一种解决方案)

    官方IO: https://mermaid-js.github.io/mermaid/#/ 官方对mermaid的简介是这样的:Markdownish syntax for generating fl ...

  3. vim中的替换操作

    在vim中 :s(substitute)命令用于查找并替换字符串.使用方法如下: :s/<find-this>/<replace-with-this>/<flags> ...

  4. Centos7 composer安装时 Warning: This development build of composer is over 60 days old. It is recommended to update it by running "/usr/bin/composer self-update" to get the latest version.

    emmm,其实就是想让你运行一下/usr/bin/composer self-update这个命令更新一下

  5. MVC、MVP、MVVM模型

    在学习vue.react的过程中,总能看到MVVM模型,那么MVVM究竟是什么,下面将我最近看到的资料以及自己的想法总结一下. 与MVVM相似的,还有MVC.MVP,先从MVC.MVP这两个入手,方面 ...

  6. django OperationalError: unable to open database file 创建数据库

  7. express 框架的使用方法

    express  框架的使用方法: 第一步: 生成一个 (express)项目工程 命令提示框的指令是: express    (文件名) express    -e      (文件名) 两段指令的 ...

  8. SpringBoot中注入ApplicationContext对象的三种方式

    [本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 在项目中,我们可 ...

  9. 第一章:开始启程-你的第一行Android代码

    Android 系统为开发者提供了什么? 四大组件 活动(Activity):界面 服务(Service):后台默默运行 广播接收器(Broadcast Receiver):接收.发送广播消息 内容提 ...

  10. git merge整理

    ========================================================== git bash merge 一.开发分支(dev)上的代码达到上线的标准后,要合 ...