SpringBoot2.2.6统一异常返回json,取消Whitelabel Error Page

本文介绍了如何在SpringBoot2.2.6中使用@RestControllerAdvice和@ExceptionHandler来统一处理异常并返回JSON格式的错误信息。首先创建一个自定义异常类,继承自RuntimeException。然后定义一个用于序列化错误信息到JSON的Result类,确保添加了@Data注解。接着,创建一个全局异常处理类GlobalExceptionHandler,利用@RestControllerAdvice进行配置。最后通过测试,验证了当触发异常时,系统能够返回预定格式的错误信息。

统一异常返回非常简单就是@RestControllerAdvice+@ExceptionHandler()这两个注解

一、新建一个自定义异常类,继承RuntimeException

public class CommonException extends RuntimeException {
    String message;

    @Override
    public String getMessage() {
        return super.getMessage();
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public CommonException(String message) {
        this.message = message;
    }

}

二、统一返回序列化为json的类Result,

注意:Result一定要加上@data注解,可能是我这个类有大小问题,此处可以参考https://blog.youkuaiyun.com/APPTITE/article/details/104600529/

@Data
public class Result<T> {
    private boolean success = false;

    private String message = null;

    private T bean = null;

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

    /**
     * 通用返回成功
     *
     * @param bean
     * @param <K>
     * @return
     */
    public static <K> Result<K> success(K bean) {
        Result<K> result = new Result<K>();
        result.success = true;
        result.message = null;
        result.bean = bean;
        return result;
    }

    /**
     * 通用返回失败
     *
     * @param bean
     * @param <K>
     * @return
     */
    public static <K> Result<K> failed(K bean) {
        Result<K> result = new Result<K>();
        result.success = true;
        result.message = null;
        result.bean = bean;
        return result;
    }

    /**
     * 返回失败的消息
     *
     * @param message
     * @param <K>
     * @return
     */
    public static <K> Result<K> failed(String message) {
        Result<K> result = new Result<K>();
        result.success = false;
        result.message = message;
        result.bean = null;
        return result;
    }

    /**
     * 生成一个成功的提示消息
     * @param message
     * @param <K>
     * @return
     */
    public static <K> Result<K> ok(String message) {
        Result<K> result = new Result<K>();
        result.success = true;
        result.message = message;
        result.bean = null;
        return result;
    }
    /**
     * 返回成功结果并带有message
     *
     * @param bean
     * @param message
     * @param <K>
     * @return
     */
    public static <K> Result<K> successAndMessage(K bean, String message) {
        Result<K> result = new Result<K>();
        result.success = true;
        result.message = message;
        result.bean = bean;
        return result;
    }
    /**
     * 返回失败结果并带有message
     *
     * @param bean
     * @param message
     * @param <K>
     * @return
     */
    public static <K> Result<K> failedAndMessage(K bean, String message) {
        Result<K> result = new Result<K>();
        result.success = false;
        result.message = message;
        result.bean = bean;
        return result;
    }
}

三、新建一个全局异常处理类GlobalExceptionHandler

@RestControllerAdvice是@ControllerAdvice和@@ResponseBody结合

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
    /**
     * 所有的异常处理
     * //Exception 这个是所有异常的父类
     * @param e
     * @return
     */
    @ExceptionHandler(Exception.class)
    public Object exceptionHandler(HttpServletRequest request, Exception e) {
        log.error("", e);
        return Result.failed("系统运行发生异常,并且controller中未处理");
    }

    /**
     * 拦截自定异常
     * @param commonException
     * @return
     */
    @ExceptionHandler(CommonException.class)
    public Object commonException(HttpServletRequest request, CommonException commonException) {
        log.error("", commonException);
        return Result.failed("系统运行发生异常,并且controller中未处理");

    }


    /**
     * 拦截参数绑定错误
     * @param e
     * @return
     */
    @ExceptionHandler(BindException.class)
    @ResponseBody
    public Object handleBindException(BindException e) {
        log.error("参数绑定错误", e);
        return Result.failed("参数绑定错误");
    }

    @ExceptionHandler(value = HttpRequestMethodNotSupportedException.class)
    @ResponseBody
    public Result handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException exception) {
        log.error("处理方法不支持", exception);
        return Result.failed("处理方法不支持");

    }
}

四、测试

    @RequestMapping(value = "/err")
    @ResponseBody
    public Result testErr(String name) {
        log.info(name+"222222222222222222222222222222222222");
        if (true) {
            throw new CommonException("扣减库存异常");
        }
        return Result.ok("rrr");
    }

输入http://127.0.0.1:8081/sbm/err

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值