SpringBoot全局异常处理及自定义异常
首先定义自定义返回类,如果自己项目中已经有了自定义返回类只需要将后面的代码做相应的修改即可;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
 * 统一API对象返回
 * @param <T>
 * @Author: TanXJ
 * @Date: 2021/10/13 9:31
 */
@Data
@NoArgsConstructor
public class ResultBean<T> {
    /** 状态码 */
    @ApiModelProperty(value = "状态码", example = "200")
    private Integer code;
    /** 返回消息 */
    @ApiModelProperty(value = "返回消息", example = "操作成功")
    private String message;
    /** 状态 */
    @ApiModelProperty(value = "状态", example = "true")
    private boolean status;
    /** 返回数据 */
    @ApiModelProperty(value = "返回数据", example = "")
    private T data;
    public ResultBean(Integer code, String message, boolean status, T data) {
        this.code = code;
        this.message = message;
        this.status = status;
        this.data = data;
    }
    public ResultBean(ResultCode resultCode, boolean status, T data) {
        this.code = resultCode.getCode();
        this.message = resultCode.getMsg();
        this.status = status;
        this.data = data;
    }
    public ResultBean(ResultCode resultCode, boolean status) {
        this.code = resultCode.getCode();
        this.message = resultCode.getMsg();
        this.status = status;
        this.data = null;
    }
    public static <T> ResultBean success() {
        return new ResultBean<>(ResultCode.OK, true);
    }
    public static <T> ResultBean message(String message) {
        return new ResultBean<>(ResultCode.OK.getCode(), message, true, null);
    }
    public static <T> ResultBean success(T data) {
        return new ResultBean<>(ResultCode.OK, true, data);
    }
    public static <T> ResultBean fail() {
        return new ResultBean<>(ResultCode.ERROR, false);
    }
    public static <T> ResultBean fail(ResultCode resultCode) {
        return new ResultBean<>(resultCode, false);
    }
    public static <T> ResultBean fail(Integer code, String message) {
        return new ResultBean<>(code, message, false, null);
    }
    public static <T> ResultBean fail(ResultCode resultCode, T data) {
        return new ResultBean<>(resultCode, false, data);
    }
    public static <T> ResultBean fail(Integer code, String message, T data) {
        return new ResultBean<>(code, message, false, data);
    }
}
创建全局异常处理
import com.newmap.common.response.ResultBean;
import com.newmap.common.response.ResultCode;
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;
/**
 * @ClassName: GlobalExceptionHandler
 * @Description: 全局异常处理
 * @Author: TanXJ
 * @Date: 2022/5/28 19:14
 */
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {
    /**
     * 处理自定义的业务异常
     * @param req
     * @param e
     * @return
     */
    @ExceptionHandler(value = CustomException.class)
    @ResponseBody
    public ResultBean bizExceptionHandler(HttpServletRequest req, CustomException e){
        log.error("发生业务异常!原因是:{}",e.getMessage());
        return ResultBean.fail(e.getCode(),e.getMessage());
    }
    /**
     * 处理运行时异常
     * @param req
     * @param e
     * @return
     */
    @ExceptionHandler(value = RuntimeException.class)
    @ResponseBody
    public ResultBean runtimeExceptionHandler(HttpServletRequest req, RuntimeException e){
        log.error("发生运行时异常!原因是:{}",e.getMessage());
        return ResultBean.fail(500, e.getMessage());
    }
    /**
     * 处理空指针的异常
     * @param req
     * @param e
     * @return
     */
    @ExceptionHandler(value = NullPointerException.class)
    @ResponseBody
    public ResultBean exceptionHandler(HttpServletRequest req, NullPointerException e){
        log.error("发生空指针异常!原因是:",e);
        return ResultBean.fail(ResultCode.SYSTEM_ERROR);
    }
    /**
     * 处理其他异常
     * @param req
     * @param e
     * @return
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public ResultBean exceptionHandler(HttpServletRequest req, Exception e){
        log.error("未知异常!原因是:",e);
        return ResultBean.fail(ResultCode.UNKNOWN_ERROR);
    }
}
创建自定义异常处理类,这里只定义了一个自定义异常处理类,在实际的的项目中可以定义多个自定义异常处理类
import com.newmap.common.response.ResultCode;
import lombok.Getter;
/**
 * @ClassName: StudentException
 * @Description: 自定义异常类
 * @Author: TanXJ
 * @Date: 2022/5/28 19:09
 */
@Getter
public class CustomException extends RuntimeException {
    private Integer code;
    private String msg;
    public CustomException() {
        super();
    }
    public CustomException(ResultCode resultCode) {
        super(resultCode.getMsg());
        this.code = resultCode.getCode();
        this.msg = resultCode.getMsg();
    }
    public CustomException(ResultCode resultCode, Throwable cause) {
        super(resultCode.getMsg(), cause);
        this.code = resultCode.getCode();
        this.msg = resultCode.getMsg();
    }
    public CustomException(String errorMsg) {
        super(errorMsg);
        this.msg = errorMsg;
    }
    public CustomException(Integer errorCode, String errorMsg) {
        super(errorMsg);
        this.code = errorCode;
        this.msg = errorMsg;
    }
    public CustomException(Integer errorCode, String errorMsg, Throwable cause) {
        super(errorMsg, cause);
        this.code = errorCode;
        this.msg = errorMsg;
    }
    public Integer getErrorCode() {
        return code;
    }
    public void setErrorCode(Integer errorCode) {
        this.code = errorCode;
    }
    public String getErrorMsg() {
        return msg;
    }
    public void setErrorMsg(String errorMsg) {
        this.msg = errorMsg;
    }
    public String getMessage() {
        return msg;
    }
    @Override
    public Throwable fillInStackTrace() {
        return this;
    }
}
代码中应用
@Override
    public UserPO add(HttpServletRequest httpServletRequest, UserVO userVO) {
        // 检查用户信息是否为空
        if(userVO.getUserAccount() == null || userVO.getUserPassword() == null){
            throw new CustomException(ResultCode.USER_INFO_IS_NULL);
        }
......
												
											SpringBoot全局异常处理及自定义异常的更多相关文章
- Springboot的异常处理与自定义异常
		
园友们好,元旦很快就到来了,提前祝各位园友们元旦快乐,今天给大家分享一个工作中必用一个知识点,就是使用枚举构建自定义异常并应用于springboot的异常处理器.开始之前我先把这个案例的结构大致说明一 ...
 - springboot 全局异常处理
		
springboot 全局异常处理 研究了半天springboot的全局异常处理,虽然还是需要再多整理一下,但是对于常见的404和500足以可以区分开,能够根据这两个异常分别处理 首先配置视图解析路径 ...
 - 【第二十三章】 springboot + 全局异常处理
		
一.单个controller范围的异常处理 package com.xxx.secondboot.web; import org.springframework.web.bind.annotation ...
 - 第二十三章 springboot + 全局异常处理
		
一.单个controller范围的异常处理 package com.xxx.secondboot.web; import org.springframework.web.bind.annotation ...
 - spring boot 全局异常处理及自定义异常类
		
全局异常处理: 在处理controller层抛出的自定义异常时,可以实现@ControllerAdvice注解捕获,配合@ExceptionHandler来增强所有的@requestMapping方法 ...
 - SpringBoot全局异常处理方式
		
每个项目全局异常处理非常重要, 今天在处理项目架构的时候添加了一个全局异常处理. 大概三种异常情况: 一:在进入Controller之前,譬如请求一个不存在的地址,404错误. 二:在执行@Reque ...
 - SpringBoot全局异常处理与定制404页面
		
一.错误处理原理分析 使用SpringBoot创建的web项目中,当我们请求的页面不存在(http状态码为404),或者器发生异常(http状态码一般为500)时,SpringBoot就会给我们返回错 ...
 - SpringBoot  全局异常处理 @RestControllerAdvice +@ExceptionHandler 请求参数校验
		
ControllerAdvice 指示带注释的类辅助“控制器”. 作为的特殊化@Component,允许通过类路径扫描自动检测实现类. 通常用于定义@ExceptionHandler, @InitBi ...
 - springboot全局异常处理(1)
		
新建一个类 在类上加一个注解即可 @ControllerAdvice /** * 全局错误处理 * @author sys * */ @ControllerAdvice @ResponseBody p ...
 - springboot全局异常处理
		
@Slf4j@ControllerAdvicepublic class RestExceptionHandler extends ResponseEntityExceptionHandler { @E ...
 
随机推荐
- 【深度学习】c++部署onnx模型(Yolov5、PP-HumanSeg、GoogLeNet、UNet)
			
这两天部署了好多模型,记录一下.代码链接. onnxruntime在第一张图的推理上比opencv快很多,但在后面的图上略微慢了一点. 不同的模型的部署时的输出不同,处理时需要对输出比较了解,下面分别 ...
 - Vue.js 动态组件与异步组件
			
title: Vue.js 动态组件与异步组件 date: 2024/6/2 下午9:08:50 updated: 2024/6/2 下午9:08:50 categories: 前端开发 tags: ...
 - Linux字符设备驱动学习
			
注:本文是<Linux设备驱动开发详解:基于最新的Linux 4.0内核 by 宋宝华 >一书学习的笔记,大部分内容为书籍中的内容. 书籍可直接在微信读书中查看:Linux设备驱动开发详解 ...
 - Qt--点击按钮弹出一个对话框
			
本文简要说明,如何实现点击按钮弹出一个文本框. 1)首先创建工程,我们就创建一个QMainWindow,不选择UI,就好了. 2)然后再单独创建一个C++类文件,最后得到的工程代码如下: 由于在创建m ...
 - 知乎x-zse-96逆向分析
			
声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 目标网站 aHR0cHM6 ...
 - 阿里bxet逆向
			
声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 目标网站 x82y 分析过 ...
 - AlexNet论文解读
			
前言 作为深度学习的开山之作AlexNet,确实给后来的研究者们很大的启发,使用神经网络来做具体的任务,如分类任务.回归(预测)任务等,尽管AlexNet在今天看来已经有很多神经网络超越了它,但是 ...
 - OFBiz RCE漏洞复现(CVE-2023-51467)
			
漏洞名称 Apache OFBiz 鉴权绕过导致命令执行 漏洞描述 Apache OFBiz是一个非常著名的电子商务平台,是一个非常著名的开源项目,提供了创建基于最新J2EE/XML规范和技术标准,构 ...
 - 14-vertical-aligin
			
01 行盒的理解 作用: 将当前行里的所有内容包裹起来 <!DOCTYPE html> <html lang="en"> <head> < ...
 - 深入理解Spring AOP中的@EnableAspectJAutoProxy
			
本文分享自华为云社区<Spring高手之路20--深入理解@EnableAspectJAutoProxy的力量>,作者: 砖业洋__. 1. 初始调试代码 面向切面编程(AOP)是一种编程 ...