SpringBoot统一异常拦截处理并返回json信息

1,653 阅读2分钟

1. 先创建一个自定义异常类,继承 RuntimeException

/**
 * 自定义异常,统一处理异常,便于解耦
 * service与controller错误的解耦,不会被service返回的类型而限制
 */
public class MyCustomException extends RuntimeException {

    /**
     * 响应结果枚举类
     */
    private ResponseStatusEnum responseStatusEnum;

    public MyCustomException(ResponseStatusEnum responseStatusEnum) {
        super("异常状态码为:" + responseStatusEnum.status()
                + ";异常信息:" + responseStatusEnum.msg());
        this.responseStatusEnum = responseStatusEnum;
    }

    public ResponseStatusEnum getResponseStatusEnum() {
        return responseStatusEnum;
    }

    public void setResponseStatusEnum(ResponseStatusEnum responseStatusEnum) {
        this.responseStatusEnum = responseStatusEnum;
    }
}

自定义异常类,继承 RuntimeException

然后添加一个响应结果枚举类参数 ResponseStatusEnum,实现get、set方法

ResponseStatusEnum 我会贴在文章后面

2. 创建一个统一封装处理异常类

/**
 * 统一封装处理异常
 */
public class GraceException {

    public static void display(ResponseStatusEnum responseStatusEnum) {
        throw new MyCustomException(responseStatusEnum);
    }

}

这个类也很简单,添加一个带参数的静态方法即可,这个参数就是响应结果枚举类 ResponseStatusEnum

主要功能就是将异常抛给我们上面创建的自定义异常类

3. 创建统一异常拦截处理类,使用 @ControllerAdvice + @ExceptionHandler 注解

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

/**
 * 统一异常拦截处理
 * 可以针对异常的类型进行捕获,然后返回json信息到前端
 */
@ControllerAdvice
public class GraceExceptionHandler {

    @ExceptionHandler(MyCustomException.class)
    @ResponseBody
    public GraceJsonResult returnMyException(MyCustomException e) {
        e.printStackTrace();
        return GraceJsonResult.exception(e.getResponseStatusEnum());
    }

}

这里使用的是 @ControllerAdvice + @ExceptionHandler 注解的方式进行异常的拦截

GraceJsonResult 就是接口响应类,可以替换成自己项目中的,这个无所谓

GraceJsonResult类,仅供参考

public class GraceJsonResult {

    /**
     * 响应业务状态码
     */
    private Integer status;

    /**
     * 响应消息
     */
    private String msg;

    /**
     * 响应数据,可以是Object,也可以是List或Map等
     */
    private Object data;

    public static GraceJsonResult exception(ResponseStatusEnum responseStatus) {
        return new GraceJsonResult(responseStatus);
    }

}

响应结果枚举类 ResponseStatusEnum

public enum ResponseStatusEnum {

    /**
     * 成功或失败
     */
    SUCCESS(200, true, "操作成功!"),
    FAILED(500, false, "操作失败!"),

    /**
     * 50x
     */
    UN_LOGIN(501, false, "请登录后再继续操作!"),
    NO_AUTH(503, false, "您的权限不足,无法继续操作!"),
    USER_NOT_EXIST_ERROR(516, false, "用户不存在!");

    /**
     * 响应业务状态
     */
    private final Integer status;
    /**
     * 调用是否成功
     */
    private final Boolean success;
    /**
     * 响应消息,可以为成功或者失败的消息
     */
    private final String msg;

    ResponseStatusEnum(Integer status, Boolean success, String msg) {
        this.status = status;
        this.success = success;
        this.msg = msg;
    }

    public Integer status() {
        return status;
    }

    public Boolean success() {
        return success;
    }

    public String msg() {
        return msg;
    }
}

4. 使用方法,示例代码

private void checkUserExist(String username) {
	User user = userService.queryUserByUsername(username);

	if (user == null) {
		GraceException.display(ResponseStatusEnum.USER_NOT_EXIST_ERROR);
	}
}