Spring全局统一异常处理

news/2024/7/5 21:15:32

文章目录

  • 前言
  • 一、异常实体
  • 二、自定义异常类
  • 三、全局异常拦截
  • 四、具体使用


前言

我们开发项目的时候,数据在请求过程中发生错误是非常常见的事情。
如:权限不足、数据唯一异常、数据不能为空异常、业务异常等。 这些异常如果不经过处理会对前端开发人员和使用者造成不便,因此我们就需要统一处理他们。

一、异常实体

package com.example.demo.exception;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

import java.time.LocalDateTime;

/**
 * @author Clang
 * @version 1.0
 * @date 2022/6/6 15:05
 */
@Data
public class ApiError {
    private Integer status;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime timestamp;
    private String message;

    private ApiError() {
        timestamp = LocalDateTime.now();
    }

    public ApiError(Integer status, String message) {
        this();
        this.status = status;
        this.message = message;
    }
}

二、自定义异常类

封装了 BadRequestException,用于处理通用的异常

package com.example.demo.exception;

import lombok.Getter;
import org.springframework.http.HttpStatus;

import static org.springframework.http.HttpStatus.BAD_REQUEST;

/**
 * @author Clang
 * @version 1.0
 * @date 2022/6/6 15:00
 */
@Getter
public class BadRequestException extends RuntimeException {
    private Integer status = BAD_REQUEST.value();

    public BadRequestException(String msg) {
        super(msg);
    }

    public BadRequestException(HttpStatus status, String msg) {
        super(msg);
        this.status = status.value();
    }
}

三、全局异常拦截

使用全局异常处理器 @RestControllerAdvice 处理请求发送的异常

  • @RestControllerAdvice:默认会扫描指定包中所有@RequestMapping注解
  • @ExceptionHandler:通过@ExceptionHandler的 value 属性可过滤拦截的条件
package com.example.demo.exception;

import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import static org.springframework.http.HttpStatus.BAD_REQUEST;

/**
 * @author Clang
 * @version 1.0
 * @date 2022/6/6 15:04
 */
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
    /**
     * 处理所有不可知的异常
     *
     * @param e
     * @return
     */
    @ExceptionHandler(Throwable.class)
    public ResponseEntity handleException(Throwable e) {
        ApiError apiError = new ApiError(BAD_REQUEST.value(), e.getMessage());
        return buildResponseEntity(apiError);
    }

    /**
     * 处理自定义异常
     *
     * @param e
     * @return
     */
    @ExceptionHandler(value = BadRequestException.class)
    public ResponseEntity<ApiError> badRequestException(BadRequestException e) {
        ApiError apiError = new ApiError(e.getStatus(), e.getMessage());
        return buildResponseEntity(apiError);
    }

    /**
     * 统一返回
     *
     * @param apiError
     * @return
     */
    private ResponseEntity<ApiError> buildResponseEntity(ApiError apiError) {
        return new ResponseEntity(apiError, HttpStatus.valueOf(apiError.getStatus()));
    }
}

四、具体使用

throw new BadRequestException(HttpStatus.OK, "发送了异常");

提示:更多内容可以访问Clang’s Blog:https://www.clang.asia


http://www.niftyadmin.cn/n/2521484.html

相关文章

Jenkins前端项目node-sass下载报错的处理

文章目录一、报错信息二、解决方法一、报错信息 Unable to save binary /var/lib/jenkins/workspace/news-html5-test/node_modules/node-sass/vendor/freebsd-x64-48 : { Error: EACCES: permission denied, mkdir /var/lib/jenkins/workspace/news-html5-test/node_modules/…

Word 无法创建工作文件 请检查临时环境变量 解决方法

打开注册表&#xff0c;找到这个路径(前面的值有可能不一样&#xff0c;我也不太清楚)HKEY_USERS/S-1-5-21-1801674531-842925246-1957994488-500/Software/Microsoft/Windows/CurrentVersion/Explorer/User Shell Folders修改cache键值为你的ie缓存路径或其他可用的路径就可以…

记录一次Java程序异常退出的排查过程

文章目录前言一、异常退出信息二、排查步骤1.输出dump文件2.排查是否Linux系统主动杀掉了进程3.JVM自身奔溃4.JVM参数调整总结前言 最近正处于项目开发阶段&#xff0c;前端一直反应服务访问不上&#xff0c;每次重启之后隔不了多长时间就会出现异常退出&#xff0c;通过网上查…

thinkpad 最新 驱动 下载

http://think.lenovo.com.cn/support/driver/driversdownlist.aspx?categoryid29421&osid233&description2767&count2&mcid29324

Docker私有仓库打开2375端口

文章目录前言1、打开步骤1.1、修改配置1.2 重启服务前言 在我们开发测试过程中&#xff0c;需要频繁的更新docker镜像&#xff0c;然而默认情况下&#xff0c;docker的2375端口是关闭的&#xff0c;下面介绍如何打开端口。 1、打开步骤 1.1、修改配置 登录docker所在服务器&…

IDEA启动报错:Command line is too long的解决办法

文章目录前言一、解决办法前言 在使用IntelliJ IDEA启动项目时&#xff0c;如果出现“Command line is too long”的错误提示&#xff0c;一般是因为命令行参数过长导致的。这种错误一般是由于在项目中引入了大量的第三方包或者配置了大量的VM参数导致的。 一、解决办法 解决…

使用软连接的方式修改Docker数据存储目录

文章目录前言一、迁移步骤前言 Docker 安装的东西多了或者目录分配大小未提前规划好&#xff0c;就容易出现磁盘空间不足的问题&#xff0c;可以采用软链接的方式迁移数据目录空间。 一、迁移步骤 要使用软连接的方式修改 Docker 数据存储目录&#xff0c;需要执行以下步骤&a…

注册 @live.com @msn.com邮箱

注册live.com邮箱是很早的事了&#xff0c;现在在http://mail.live.com还是只能注册live.cn和hotmail.com。再把国人注册live.com的简便方法写上。 方法一&#xff1a;直接带参数设置的注册地址&#xff0c;打开进入注册页面  https://signup.live.com/signup.aspx?mktEN-…