SpringBoot 统一异常处理

news2025/2/27 14:53:49

1. 统一返回结果集

package com.liming.pojo;

import com.liming.exception.AppExceptionCodeMsg;
import lombok.Data;

/**
 * 全局统一返回结果类
 * @author 黎明
 * @date 2023/9/6 14:11
 * @version 1.0
 */
@Data
public class Result<T> {

    private Integer code; // 状态码
    private String msg; //返回消息
    private T data; //返回数据

    /**
     * 私有化构造方法,禁止在其它类创建对象
     */
    private Result(Integer code,String msg,T data){
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    // 不带自定义消息响应成功的方法
    public static <T> Result success(T data){
        Result resp = new Result(200, "success", data);
        return resp;
    }

    // 带自定义消息响应成功的方法
    public static <T> Result success(String msg, T data){
        Result resp = new Result(200,msg, data);
        return resp;
    }

    // 自定义异常返回的结果
    public static <T> Result error(AppExceptionCodeMsg appExceptionCodeMsg){
        Result resp = new Result(appExceptionCodeMsg.getCode(), appExceptionCodeMsg.getMsg(), null);
        return resp;
    }

    // 其他异常返回的结果
    public static <T> Result error(Integer code, String msg){
        Result resp = new Result(code,msg, null);
        return resp;
    }

}

2.业务相关异常枚举类

package com.liming.exception;

/**
 * 这个枚举类中定义的都是跟业务有关的异常
 * @author 黎明
 * @date 2023/9/6 14:31
 * @version 1.0
 */
public enum AppExceptionCodeMsg {

    // 业务操作错误定义
    INVALID_CODE(10000,"验证码无效"),
    USERNAME_NOT_EXISTS(10001,"用户名不存在"),
    USER_CREDIT_NOT_ENOUTH(10002,"用户积分不足"),
    ;

    // 错误码
    private Integer code ;
    // 错误消息
    private String msg ;

    AppExceptionCodeMsg(Integer code, String msg){
        this.code = code;
        this.msg = msg;
    }

    public Integer getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }
}

3.自定义异常类

package com.liming.exception;

/**
 * 自定义异常类
 *
 * @author 黎明
 * @version 1.0
 * @date 2023/9/6 14:45
 */
public class AppException extends RuntimeException {

    // 错误码
    private Integer code;
    // 异常的消息描述
    private String msg;


    public AppException(AppExceptionCodeMsg appExceptionCodeMsg) {
        super();
        this.code = appExceptionCodeMsg.getCode();
        this.msg = appExceptionCodeMsg.getMsg();
    }

    public AppException(Integer code, String msg) {
        super();
        this.code = code;
        this.msg = msg;
    }

    public int getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }
}

4.统一异常处理类

package com.liming.exception;

import com.liming.pojo.Result;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 全局统一异常处理类
 *
 * @author 黎明
 * @version 1.0
 * @date 2023/9/6 14:42
 */
@ControllerAdvice
public class GlobalExceptionHandler {


    @ExceptionHandler(value = {Exception.class})
    @ResponseBody
    public <T> Result<T> exceptionHandler(Exception e) {
        // 这里先判断拦截到的Exception是不是我们自定义的异常类型
        if (e instanceof AppException) {
            AppException appException = (AppException) e;
            return Result.error(appException.getCode(), appException.getMsg());
        }

        // 如果拦截的异常不是我们自定义的异常(例如:数据库主键冲突)
        return Result.error(500, "服务器端异常");
    }
}

5.测试

controller

package com.liming.controller;

import com.liming.exception.AppException;
import com.liming.exception.AppExceptionCodeMsg;
import com.liming.pojo.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Arrays;
import java.util.List;

/**
 * @author 黎明
 * @version 1.0
 * @date 2023/9/6 14:53
 */
@Api(tags = "统一异常处理接口")
@RestController
public class UnifiedExceptionController {

    @ApiOperation("异常测试")
    @GetMapping("/demo")
    public Result<String> demo1(String name) {
        if ("ok".equals(name)) {
            return Result.success("succ");
        }
        if ("err".equals(name)) {
            //抛自定义业务相关的异常
            throw new AppException(AppExceptionCodeMsg.USERNAME_NOT_EXISTS);
        }
        if ("errCode".equals(name)) {
            //抛自定义业务相关的异常
            throw new AppException(AppExceptionCodeMsg.INVALID_CODE);
        }
        if("notenough".equals(name)){
            //抛自定义业务相关的异常
            throw new AppException(AppExceptionCodeMsg.USER_CREDIT_NOT_ENOUTH);
        }
        if ("0".equals(name)) {
            // 抛出其他异常
            int i = 1 / 0;
        }
        return Result.success("操作成功");
    }

    @GetMapping("list")
    public Result<List> list(){
        List<String> list = Arrays.asList("zhangsan","lisi","wangwu");

        return Result.success(list);
    }
}

结果展示
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/981648.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#模拟PLC设备运行

涉及&#xff1a;控件数据绑定&#xff0c;动画效果 using System; using System.Windows.Forms;namespace PLCUI {public partial class MainForm : Form{ public MainForm(){InitializeComponent();}private void MainForm_Load(object sender, EventArgs e){// 方式2&#x…

基于SpringBoot的校园失物招领系统

基于SpringBooVuet的校园失物招领系统&#xff0c;前后端分离 附万字文档 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 角色&#xff1a;管理员、用户 管理员  …

线性空间、子空间、基、基坐标、过渡矩阵

线性空间的定义 满足加法和数乘封闭。也就是该空间的所有向量都满足乘一个常数后或者和其它向量相加后仍然在这个空间里。进一步可以理解为该空间中的所有向量满足加法和数乘的组合封闭。即若 V 是一个线性空间&#xff0c;则首先需满足&#xff1a; 注&#xff1a;线性空间里面…

AR工业远程巡查系统:实时监控设备状态,及时发现潜在问题

随着工业4.0的到来&#xff0c;先进的技术和创新的解决方案正在改变着工业生产的方式。其中&#xff0c;增强现实&#xff08;AR&#xff09;技术带来的工业巡检系统就是一个典型的例子。这种系统通过在现实世界中添加虚拟信息&#xff0c;使得操作人员能够更有效地进行检查和维…

leetcode 1002. 查找共用字符

2023.9.6 个人感觉这题难度不止简单&#xff0c;考察到的东西还是挺多的。 首先理解题意&#xff0c;可以将题意转化为&#xff1a;求字符串数组中 各字符串共同出现的字符的最小值。 分为三步做&#xff1a; 构造一个哈希表hash&#xff0c;初始化第一个字符串的字母出现频率…

2020年12月 C/C++(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C编程&#xff08;1~8级&#xff09;全部真题・点这里 第1题&#xff1a;字符三角形 描述 给定一个字符&#xff0c;用它构造一个底边长5个字符&#xff0c;高3个字符的等腰字符三角形。 输入 输入只有一行&#xff0c; 包含一个字符。 输出 该字符构成的等腰三角形&#xff…

Zookeeper简述

数新网络-让每个人享受数据的价值 官网现已全新升级—欢迎访问&#xff01; 前 言 ZooKeeper是一个开源的、高可用的、分布式的协调服务&#xff0c;由Apache软件基金会维护。它旨在帮助管理和协调分布式系统和应用程序&#xff0c;提供了一个可靠的平台&#xff0c;用于处理…

苹果与芯片巨头Arm达成20年新合作协议,将继续采用芯片技术

9月6日消息&#xff0c;据外媒报道&#xff0c;芯片设计巨头Arm宣布在当地时间周二提交给美国证券交易委员会&#xff08;SEC&#xff09;的最新IPO文件中&#xff0c;透露与苹果达成了一项长达20年的新合作协议&#xff0c;加深了双方之间的合作关系。 报道称&#xff0c;虽然…

Informatica使用操作流程及Expression(表达式转换)案例2

操作流程 ①定义源<Odbc01_oracle:employees> ②定义目标<EDW_EMPLOYEES> ③创建映射<M_ORACLE_EDW01_employees> ④定义任务<S_ORCL_EDW01_employees> ⑤创建工作流<W_ORCL_EDW01_employees> ⑥工作流调度监控 ⑦查验数据 一、需求&…

js---16-----JavaScript中的类型转换机制

、类型转换机制是什么&#xff1f; JS中有六种简单数据类型&#xff1a;undefined、null、bollean、string、number、symbol&#xff0c;以及引用类型object 但是我们声明的时候只有一种数据类型&#xff0c;只用运行期间才会确定当前类型。 上面代码中&#xff0c;x的值在编…

浅谈redis未授权漏洞

redis未授权漏洞 利用条件 版本比较高的redis需要修改redis的配置文件&#xff0c;将bind前面#注释符去掉&#xff0c;将protected-mode 后面改为no 写入webshell config get dir #查看redis数据库路径 config set dir web路径# #修改靶机Redis数据库路径 config set dbfilen…

巧用抽象类与接口,打造高效Java程序(上)

White graces&#xff1a;个人主页 &#x1f649;专栏推荐:《C语言入门知识》&#x1f649; &#x1f649; 内容推荐:&#x1f649; &#x1f439;今日诗词:十年花骨东风泪&#xff0c;几点螺香素壁尘&#x1f439; 目录 &#x1f338;思维导图&#x1f338; &#x1f338;…

怎么做加密文件二维码?简单技巧快速做二维码

怎么做一个加密的文件二维码呢&#xff1f;现在将文件做成二维码来传递是一种很常见的方式&#xff0c;那么为了保证文件不会被私自下载&#xff0c;那么如何在将文件生成二维码的时候&#xff0c;给二维码进行加密设置呢&#xff1f;下面就让小编给大家分享一下二维码生成器在…

【C\C++】内存分配 和 动态内存管理方式

文章目录 内存分类题目&#xff1a;知识巩固选择题: 变量位于内存中的位置计算题 变量值的大小 答案 C语言 动态内存管理malloc / calloc / realloc作用区别 C 内存管理方式operator new 与 operator deletenew 与 delete 的实现原理malloc free 与 new delete 的区别 内存泄漏…

MySql 变量

1.系统变量 1.1 系统变量分类 变量由系统定义&#xff0c;不是用户定义&#xff0c;属于 服务器 层面。系统变量分为全局系统变量&#xff08;需要添加 global 关键字&#xff09;以及会话系统变量&#xff08;需要添加 session 关键字&#xff09;&#xff0c;有时也把全局系…

mysql UUID 作为主键的问题

UUID 在MySQL中&#xff0c;可以使用UUID()函数来生成一个新的UUID值。该函数的返回值是一个字符串类型&#xff0c;表示一个32位的十六进制数字&#xff0c;其中包含4个连字符“-”&#xff0c;例如&#xff1a;“6ccd780c-baba-1026-9564-0040f4311e29”。 varchar(32) 32*4…

【免费模板】2023数学建模国赛word+latex模板免费分享

无需转发 免费获取2023国赛模板&#xff0c;获取方式见文末 模板文件预览如下&#xff1a; 模板参考格式如下&#xff1a; &#xff08;题目&#xff09;XXXXXX 摘 要&#xff1a; 开头段&#xff1a;需要充分概括论文内容&#xff0c;一般两到三句话即可&#xff0c;长度控…

Java基础二十五(Map)

Map 接口 Map 接口是 Java 集合框架中的一种用于储存键值对映射关系的接口。Map 接口提供了一种通过键来访问值的方式&#xff0c;其中每一个键都是唯一的&#xff0c;值可以重复。 public interface Map<K,V>Map 接口的主要特征如下&#xff1a; 键唯一性&#xff1a;…

matlab数据处理: cell table array+datetime

原数据文件.csv matlab xlsread(filename{i},B2:T2881) 会同于Excel最多1048576行 舍弃 a{1,i} xlsread(filename{i},‘B2:T2881’);%读取excel文件,选定区域’B2:G2881’ readcell(filename{i},Range,E2:M2881) 会全部读取 优选 对于日期 yyyy-MM-dd HH:mm:ss.000 matlab cel…

开始MySQL之路——MySQL三大日志(binlog、redo log和undo log)概述详解

前言 MySQL实现事务、崩溃恢复、集群的主从复制&#xff0c;底层都离不开日志&#xff0c;所以日志是MySQL的精华所在。只有了解MySQL日志&#xff0c;才算是彻底搞懂MySQL。 日志是mysql数据库的重要组成部分&#xff0c;记录着数据库运行期间各种状态信息。mysql日志主要包…