@ControllerAdvice三个场景:》https://www.cnblogs.com/lenve/p/10748453.html

  1. 全局异常处理
  2. 全局数据绑定
  3. 全局数据预处理


首先定义一个全局异常哪个接口,以备拓展使用
package com.wangbiao.common.exception.global; /**
* TODO
*
* @author wangbiao
* @Title 公共异常处理接口
* @module TODO
* @description TODO
* @date 2021/5/16 23:04
*/
public interface BussinessException {
String getResultCode(); /** 错误描述*/
String getResultMsg();
}
实现1中的接口,实现自己的异常构造与类型
package com.wangbiao.common.exception.global; import lombok.Data; /**
* TODO
*
* @author wangbiao
* @Title 自定义的异常类
* @module TODO
* @description TODO
* @date 2021/5/16 23:08
*/
@Data
public class Bussinesses extends RuntimeException{
/**
* 错误码
*/
protected String errorCode;
/**
* 错误信息
*/
protected String errorMsg; public Bussinesses() {
super();
} public Bussinesses(BussinessException errorInfoInterface) {
super(errorInfoInterface.getResultCode());
this.errorCode = errorInfoInterface.getResultCode();
this.errorMsg = errorInfoInterface.getResultMsg();
} public Bussinesses(BussinessException errorInfoInterface, Throwable cause) {
super(errorInfoInterface.getResultCode(), cause);
this.errorCode = errorInfoInterface.getResultCode();
this.errorMsg = errorInfoInterface.getResultMsg();
} public Bussinesses(String errorMsg) {
super(errorMsg);
this.errorMsg = errorMsg;
} public Bussinesses(String errorCode, String errorMsg) {
super(errorCode);
this.errorCode = errorCode;
this.errorMsg = errorMsg;
} public Bussinesses(String errorCode, String errorMsg, Throwable cause) {
super(errorCode, cause);
this.errorCode = errorCode;
this.errorMsg = errorMsg;
} public String getMessage() {
return errorMsg;
} @Override
public Throwable fillInStackTrace() {
return this;
}
}
定义一个常见异常的枚举,比如500,400,302等,在实际业务中可以把已知常见的异常类型进行封装

package com.wangbiao.common.exception.global;

/**
* TODO
*
* @author wangbiao
* @Title 公共异常枚举类
* @module TODO
* @description TODO
* @date 2021/5/16 23:05
*/
public enum CommonEnum implements BussinessException {
SUCCESS("200", "正常!"),
BODY_NOT_MATCH("400","数据格式不服!"),
SIGNATURE_NOT_MATCH("401","签名验证失败!"),
NOT_FOUND("404", "找不到!"),
INTERNAL_SERVER_ERROR("500", "程序异常"),
SERVER_BUSY("503","服务器。。。,请稍后再试!")
; private String resultCode; private String resultMsg; CommonEnum(String resultCode, String resultMsg) {
this.resultCode = resultCode;
this.resultMsg = resultMsg;
} @Override
public String getResultCode() {
return resultCode;
} @Override
public String getResultMsg() {
return resultMsg;
} }
定义一个公共返回实体封装,这里统一把返回用json封装,正常结果返回,与异常可以封装返回客户端
package com.wangbiao.common.exception.global; import com.google.gson.Gson;
import lombok.Data; /**
* TODO
*
* @author wangbiao
* @Title 自定义数据返回体
* @module TODO
* @description TODO
* @date 2021/5/16 23:10
*/
@Data
public class ResultBody {
private static final Gson gson=new Gson();
/**
* 响应代码
*/
private String code; /**
* 响应消息
*/
private String message; /**
* 响应结果
*/
private Object result; public ResultBody() {
} public ResultBody(BussinessException errorInfo) {
this.code = errorInfo.getResultCode();
this.message = errorInfo.getResultMsg();
} /**
* 响应成功
*
* @return
*/
public static ResultBody success() {
return success(null);
} /**
* 响应成功
* @param data
* @return
*/
public static ResultBody success(Object data) {
ResultBody rb = new ResultBody();
rb.setCode(CommonEnum.SUCCESS.getResultCode());
rb.setMessage(CommonEnum.SUCCESS.getResultMsg());
rb.setResult(data);
return rb;
} /**
* 响应失败
*/
public static ResultBody error(BussinessException errorInfo) {
ResultBody rb = new ResultBody();
rb.setCode(errorInfo.getResultCode());
rb.setMessage(errorInfo.getResultMsg());
rb.setResult(null);
return rb;
} /**
* 响应失败
*/
public static ResultBody error(String code, String message) {
ResultBody rb = new ResultBody();
rb.setCode(code);
rb.setMessage(message);
rb.setResult(null);
return rb;
} /**
* 响应失败
*/
public static ResultBody error( String message) {
ResultBody rb = new ResultBody();
rb.setCode("-1");
rb.setMessage(message);
rb.setResult(null);
return rb;
} @Override
public String toString() {
return gson.toJson(this);
}
}
一切就绪后,可以更具异常的类型进行分别处理与返回
package com.wangbiao.common.exception.global; import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; /**
* TODO
*
* @author wangbiao
* @Title TODO
* @module TODO
* @description TODO
* @date 2021/5/16 22:57
*/
@ControllerAdvice
@Slf4j
public class MyGlobalExceptionHandler { /**
* 处理自定义的业务异常
* @param req
* @param e
* @return
*/
@ExceptionHandler(value = Bussinesses.class) //@ExceptionHandler 注解用来指明异常的处理类型,即如果这里指定为 NullpointerException,则数组越界异常就不会进到这个方法中来
@ResponseBody
public ResultBody bussiNessesHandler(HttpServletRequest req, Bussinesses e){
log.error("发生业务异常!原因是:{}",e.getErrorMsg());
return ResultBody.error(e.getErrorCode(),e.getErrorMsg());
} /**
* 处理空指针的异常
* @param req
* @param e
* @return
*/
@ExceptionHandler(value =NullPointerException.class)//@ExceptionHandler 注解用来指明异常的处理类型,即如果这里指定为 NullpointerException,则数组越界异常就不会进到这个方法中来
@ResponseBody
public ResultBody exceptionHandler(HttpServletRequest req, NullPointerException e){
log.error("发生空指针异常!原因是:",e);
return ResultBody.error(CommonEnum.BODY_NOT_MATCH);
} /**
* 处理其他异常
* @param req
* @param e
* @return
*/
@ExceptionHandler(value =Exception.class) //@ExceptionHandler 注解用来指明异常的处理类型,即如果这里指定为 NullpointerException,则数组越界异常就不会进到这个方法中来
@ResponseBody
public ResultBody exceptionHandler(HttpServletRequest req, Exception e){
log.error("未知异常!原因是:",e);
return ResultBody.error(CommonEnum.INTERNAL_SERVER_ERROR);
}
}

springboot全局异常封装案例的更多相关文章

  1. SpringBoot全局异常拦截

    SpringBoot全局异常捕获 使用到的技能 @RestControllerAdvice或(@ControllerAdvice+@ResponseBody) @ExceptionHandler 代码 ...

  2. SpringBoot 全局异常配置

    在日常web开发中发生了异常,往往是需要通过一个统一的异常处理来保证客户端能够收到友好的提示. 一.默认异常机制 默认异常处理(SpringBoot 默认提供了两种机制,一种是针对于web浏览器访问的 ...

  3. springBoot 全局异常方式处理自定义异常 @RestControllerAdvice + @ExceptionHandler

    前言 本文讲解使用 @ControllerAdvice + @ExceptionHandler 进行全局的 Controller 层异常处理,可以处理大部分开发中用到的自自定义业务异常处理了,再也不用 ...

  4. springboot 全局异常捕获,异常流处理业务逻辑

    前言 上一篇文章说到,参数校验,往往需要和全局的异常拦截器来配套使用,使得返回的数据结构永远是保持一致的.参数异常springboot默认的返回结构: { "timestamp": ...

  5. springboot全局异常拦截源码解读

    在springboot中我们可以通过注解@ControllerAdvice来声明一个异常拦截类,通过@ExceptionHandler获取拦截类抛出来的具体异常类,我们可以通过阅读源码并debug去解 ...

  6. 自定义Springboot全局异常类

    一.简要说明 如何实现网上文章基本是随便一搜就可以很快找到, 这里不再赘述. 二.Spring-web和Spring-webmvc 通过idea查看到两个注解位于 spring-web-5.2.2.R ...

  7. SpringBoot 全局异常拦截捕获处理

    一.全局异常处理 //Result定义全局数据返回对象 package com.xiaobing.demo001.domain; public class Result { private Integ ...

  8. springBoot 全局异常捕捉

    package cn.com.cs.core.exception; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import or ...

  9. SpringBoot全局异常的捕获设置

    1.新建立一个捕获异常的实体类 如:LeeExceptionHandler package com.leecx.exception; import javax.servlet.http.HttpSer ...

随机推荐

  1. 通过http将yum仓库发布

    说明:这里是Linux服务综合搭建文章的一部分,本文可以作为单独构建http和发布yum仓库到内网的参考. 注意:这里所有的标题都是根据主要的文章(Linux基础服务搭建综合)的顺序来做的. 如果需要 ...

  2. CAS 原理 应用

    原子CAS操作 原子操作指令里,有原子加,原子减,cas到底是什么呢? 首先看一段代码, bool compare_and_swap(int *accum, int *dest, int newval ...

  3. 【阅读笔记】Java核心技术卷一 #6.Chapter8

    8 泛型程序设计 8.1 为什么要使用泛型程序设计 类型参数(type parameters)(E.T.S...) 通配符类型(wildcard type)(?) 注意这两者用法用处并不同. 8.2 ...

  4. videojs文档翻译-EventTarget

    EventTarget new EventTarget()   EventTarget是一个可以与DOM EventTarget具有相同API的类. 它增加了包含冗长功能的缩写功能. 例如:on函数是 ...

  5. Python小白的数学建模课-10.微分方程边值问题

    小白往往听到微分方程就觉得害怕,其实数学建模中的微分方程模型不仅没那么复杂,而且很容易写出高水平的数模论文. 本文介绍微分方程模型边值问题的建模与求解,不涉及算法推导和编程,只探讨如何使用 Pytho ...

  6. 大写字母与小写字母 相差 一个 空格 A = 65 a = 97 空格 = 32

    1 //大写字母与小写字母 相差 一个 空格 A = 65 a = 97 空格 = 32 2 3 #include <stdio.h> 4 int main() 5 { 6 7 char ...

  7. FIFO 深度了解

    嘻哈第二篇,深度聊聊各种细节. 优化与跨时钟阈分析

  8. Linux应用程序安装方法

    一.linux应用程序基础 1.1.应用程序与系统命令的关系 1.2.典型应用程序的目录结构 1.3.常见的软件包封装类型 二.RPM包管理工具 2.1.RPM软件包管理器Red-Hat Packag ...

  9. docker 安装prometheus和grafna

    一.拉取镜像 docker pull prom/prometheus 二.配置 sudo mkdir /etc/prometheus/ sudo vim /etc/prometheus/prometh ...

  10. Ubuntu系统Root用户无法登录

    默认 系统 root 登录 图形界面,出现 登录失败.解决方法如下: 1,登录普通用户, 打开终端执行命令, 使用su root或sudo -i切换到root用户(必须) su root 按照提示输入 ...