Spring 全局异常捕获:自定义业务异常

响应前端成功效果:

{
    "msg": "登录成功",
    "data": {
        "username": "admin",
        "password": "admin"
    },
    "code": 200
}

失败效果:

{
    "msg": "用户密码错误",
    "data": null,
    "code": 10010
}

一、创建响应前端的结果集实体类:

ResponseResult
统一向前端返回结果集

package com.cs.demo.exception;

/**
 * @author CHAN
 * @date 2020/01/18
 */
public class ResponseResult<T> {
    /**
     * 错误码
     */
    private Integer code;

    /**
     * 错误内容
     */
    private String msg;

    /**
     * 返回前端数据
     */
    private T data;

    public ResponseResult() {
    }

    public ResponseResult(Integer code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

二、创建一个表示错误代码的枚举类:

CodeEnum

package com.cs.demo.exception;

import org.omg.CORBA.UNKNOWN;

/**
 * @author CHAN
 * @date 2020/01/18
 */
public enum CodeEnum {
    SUCCESS(200, "登录成功"),
    PASSWORD_ERROR(10010, "用户密码错误"),
    UNKNOWN_ERROR(10086, "发生未知异常");

    private Integer code;
    private String msg;

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

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

三、创建自定义异常类:

UserException
自定义异常类需要继承 RuntimeException

package com.cs.demo.exception;

/**
 * @author CHAN
 * @date 2020/01/18
 */
public class UserException extends RuntimeException {

    private Integer code;

    public UserException(CodeEnum status){
        super(status.getMsg());
        this.code = status.getCode();
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }
}

四、创建全局异常捕获类:

UserExceptionHandler
利用 @RestControllerAdvice 以及 @ExceptionHandler 捕获所有控制层抛出的异常

package com.cs.demo.exception;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

/**
 * @author CHAN
 * @date 2020/01/18
 */
@RestControllerAdvice
public class UserExceptionHandler {

    @ExceptionHandler(UserException.class)
    public ResponseResult responseResult(Exception ex){
        ResponseResult responseResult = new ResponseResult();

        // 捕获自定义业务异常
        if(ex instanceof UserException){
            responseResult.setCode(((UserException) ex).getCode());
            responseResult.setMsg(ex.getMessage());
            return responseResult;
        }
        
        // 非自定义业务异常 -- 按自己需求处理
        responseResult.setCode(CodeEnum.UNKNOWN_ERROR.getCode());
        responseResult.setMsg(CodeEnum.UNKNOWN_ERROR.getMsg());
        return responseResult;
    }

}

控制层测试

@PostMapping(value = "/login")
    private ResponseResult login(User user){
        if (!"admin".equals(user.getPassword())){
            throw new UserException(CodeEnum.PASSWORD_ERROR);
        }
        return new ResponseResult(CodeEnum.SUCCESS.getCode(), CodeEnum.SUCCESS.getMsg(), user);
    }

大功告成
测试:成功在这里插入图片描述
测试:失败
在这里插入图片描述

注意:

如果出现捕获全局异常失效或者无反应的情况,请确保使用注解@RestControllerAdvice , @ControllerAdvice 的类被spring容器扫描到。

@SpringBootApplication(scanBasePackages = “Handler 类所在的包路径”)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值