整合框架(spring...) 统一异常处理

1、 我们想让异常结果也显示为统一的返回结果对象,并且统一处理系统的异常信息,那么需要统一异常处理。

++附加:创建封装错误状态码和错误消息VO++

代码如下:

Result

复制代码
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

@Data
@Schema(description = "响应结果实体类")
public class Result<T> {


    //返回码
    @Schema(description = "业务状态码")
    private Integer code;

    //返回消息
    @Schema(description = "响应消息")
    private String message;

    //返回数据
    @Schema(description = "业务数据")
    private T data;


    // 私有化构造
    private Result() {}

    // 返回数据
    public static <T> Result<T> build(T body, Integer code, String message) {
        Result<T> result = new Result<>();
        result.setData(body);
        result.setCode(code);
        result.setMessage(message);
        return result;
    }

    // 通过枚举构造Result对象
    public static <T> Result build(T body , ResultCodeEnum resultCodeEnum) {
        return build(body , resultCodeEnum.getCode() , resultCodeEnum.getMessage()) ;
    }

}
复制代码
ResultCodeEnum
复制代码
import lombok.Getter;

@Getter // 提供获取属性值的getter方法
public enum ResultCodeEnum {

    SUCCESS(200 , "操作成功"),
    LOGIN_ERROR(201 , "用户名或者密码错误"),
    VALIDATECODE_ERROR(202 , "验证码错误") ,
    LOGIN_AUTH(208 , "用户未登录"),
    USER_NAME_IS_EXISTS(209 , "用户名已经存在"),
    SYSTEM_ERROR(9999 , "您的网络有问题请稍后重试"),
    NODE_ERROR( 217, "该节点下有子节点,不可以删除"),
    DATA_ERROR(204, "数据异常"),
    ACCOUNT_STOP( 216, "账号已停用"),
    STOCK_LESS( 219, "库存不足"),;

    private Integer code ;      // 业务状态码
    private String message ;    // 响应消息

    private ResultCodeEnum(Integer code , String message) {
        this.code = code ;
        this.message = message ;
    }

}

异常类:

创建自定义异常类

复制代码
import com.atguigu.spzx.model.vo.common.ResultCodeEnum;
import lombok.Data;
@SuppressWarnings("all")

@Data
public class NiuException extends RuntimeException{
    private String message; // 错误消息
    private Integer code;   // 错误状态码
    private ResultCodeEnum resultCodeEnum;    // 封装错误状态码和错误消息
    publicNiuException(ResultCodeEnum resultCodeEnum){
        this.resultCodeEnum=resultCodeEnum;
        this.code= resultCodeEnum.getCode();
        this.message=resultCodeEnum.getMessage();
    }
    public NiuException(String message,Integer code){
        this.code=code;
        this.message=message;
    }

}

全局异常处理器

在common-service中创建统一异常处理类GlobalExceptionHandler

// 处理自定义异常在GlobalExceptionHandler类上加自定义注解:@ExceptionHandler(value = NiuException.class)

复制代码
import com.atguigu.spzx.model.vo.common.Result;
import com.atguigu.spzx.model.vo.common.ResultCodeEnum;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @ControllerAdvice 给controller增加统一的操作处理
 * 相当于是controller的增强器
 */
@ControllerAdvice
public class GlobalExceptionHandler{
    /**
     * @ExceptionHandler(NiuException.class)出现异常的时候执行
     * @return
     * @ResponseBody 返回json格式
     */
     // 处理自定义异常
    @ExceptionHandler(NiuException.class) 
    @ResponseBody
    public Result error(NiuException e){
        return Result.build(null, e.getResultCodeEnum());
    }

}

创作不易,大家合作共赢

相关推荐
是梦终空11 分钟前
JAVA毕业设计253—基于Java+Springboot+vue3+协同过滤推荐算法的传统服饰文化平台(源代码+数据库+任务书+12000字论文)
java·spring boot·vue·毕业设计·课程设计·协同过滤推荐算法·传统服饰文化平台
HerayChen7 小时前
HbuilderX 内存溢出报错
java·大数据·linux
程序员小白条8 小时前
0经验如何找实习?
java·开发语言·数据结构·数据库·链表
小马爱打代码8 小时前
Spring AI:搭建自定义 MCP Server:获取 QQ 信息
java·人工智能·spring
郭涤生8 小时前
QT 架构笔记
java·数据库·系统架构
韩立学长8 小时前
基于Springboot流浪动物领养网站0kh2iyb4(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
daidaidaiyu8 小时前
基于LangGraph开发复杂智能体学习一则
java·ai
Moment8 小时前
从美团全栈化看 AI 冲击:前端转全栈,是自救还是必然 🤔🤔🤔
前端·后端·面试
小小8程序员9 小时前
STL 库(C++ Standard Template Library)全面介绍
java·开发语言·c++
a努力。9 小时前
Redis Java 开发系列#2 数据结构
java·数据结构·redis