springboot全局异常处理_springboot 教你如何更加优雅的处理全局异常

 众所周知,现在的项目开发基本上都是前后端分离,而前后端分离之后,无论在控制层,还是业务层都需要校验一些数据,无论是前端传过来的,还是经过业务处理判断的,如果不合法的需要友好的提示给用户,否则用户收到一个 NullPointerException 这种的,懂开发的肯定一眼看出来,这还不简单,不就是个空指针嘛,但是对不懂开发的人来说呢?肯定很懵逼,再说直接将错误的信息直接暴露给用户,这样的体验可想而知。

今天就针对 springboot 做一次统一的异常处理

cdedb42aea445ad3eb453e6a6bdf68b0.png

  • 今日安利好物:springboot 全局异常处理

  • 全局异常处理有什么好处?

    当你自定义了一个异常类,可以在全局异常处理器中来捕捉该异常。当然也可以直接在抛出异常处直接捕获,但是这样需要在每一个抛出的地方都写一次捕获代码,看起来不够美观且复用性不强,其他异常同理

文中需要用到的部分注解

@ControllerAdvice,是Spring3.2提供的新注解,它是一个 Controller 增强器,可对 controller 中被 @RequestMapping 注解的方法加一些逻辑处理,这里我们使用它来做全局异常处理。

@RestControllerAdvice ,ControllerAdvice 的增强版,包含了@ControllerAdvice 和 @ResponseBody 注解功能;默认处理所有 controller 中被 @RequestMapping注解的方法,并且返回的数据为 json 格式

@ExceptionHandler ,使用此注解来指定获取自定义异常类

项目层级如下

e26c8f27b885d506234aec75b96cab5d.png

01

定义自己的统一返回异常类

1、BaseException  继承  RuntimeException

原因:spring 对于 RuntimeException 异常才会进行事务回滚

package com.wxw.springboot_exception.exception;/** * @author wuxiongwei * @date 2020/5/27 10:45 * @Description */public class BaseException extends RuntimeException {    private static final long serialVersionUID = 4397143116579765052L;    /**     * 错误代码     */    private String code;    /**     * 错误信息     */    private String message;    public String getCode() {        return code;    }    public void setCode(String code) {        this.code = code;    }    public String getMessage() {        return message;    }    public void setMessage(String message) {        this.message = message;    }}

2、定义  CustomException  继承刚才的 BaseException

package com.wxw.springboot_exception.exception;/** * @author wuxiongwei * @date 2020/5/27 10:57 * @Description */public class CustomException extends BaseException {    private static final long serialVersionUID = -7796809450875600938L;    public CustomException(String code,String message) {        setCode(code);        setMessage(message);    }    public CustomException(String message) {        setCode("");        setMessage(message);    }    public CustomException() {    }}

3、使用断言封装部分方法,取代 if 判断,返回相应异常

平时,我们可能会写很多的 if 判断,来判断这个是不是空,那个是不是空,

使用这种方式可以极大简化我们的 if 判断,并且使我们的代码更加优雅

package com.wxw.springboot_exception.exception;/** * @author wuxiongwei * @date 2020/5/27 10:57 * @Description */public class CustomException extends BaseException {    private static final long serialVersionUID = -7796809450875600938L;    public CustomException(String code,String message) {        setCode(code);        setMessage(message);    }    public CustomException(String message) {        setCode("");        setMessage(message);    }    public CustomException() {    }}

02

定义全局异常信息处理统一返回类

1、异常返回信息对象

package com.wxw.springboot_exception.base;import lombok.AllArgsConstructor;import lombok.Builder;import lombok.Data;import lombok.NoArgsConstructor;/** * @author wuxiongwei * @date 2020/5/27 11:07 * @Description 接口返回统一封装类 */@Data@NoArgsConstructor@AllArgsConstructor@Builderpublic class ResultResponse {    /**     * 返回状态码     */    private Integer status;    /**     * 返回信息     */    private String message;    /**     * 返回数据     */    private T data;    /**     * token     */    private String token;}

2、返回信息对象中用到的枚举类

package com.wxw.springboot_exception.Enums;/** * @author wuxiongwei * @date 2020/5/27 11:25 * @Description */public enum ResultCodeEnum {    SUCCESS(200,"请求成功"),    FAILURE(500,"请求失败"),    ;    private Integer code;    private String message;    ResultCodeEnum(Integer code, String message) {        this.code = code;        this.message = message;    }    public Integer getCode() {        return code;    }    public void setCode(Integer code) {        this.code = code;    }    public String getMessage() {        return message;    }    public void setMessage(String message) {        this.message = message;    }}

3、全局异常处理类

package com.wxw.springboot_exception.exception;import com.wxw.springboot_exception.Enums.ResultCodeEnum;import com.wxw.springboot_exception.base.ResultResponse;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.RestControllerAdvice;/** * 统一全局异常处理类 */@RestControllerAdvice //ControllerAdvice 的增强版,包含了@ControllerAdvice 和 @ResponseBody 注解功能;默认处理所有 controller 中被 @RequestMapping注解的方法//@RestControllerAdvice(basePackages = "com.wxw.springboot_exception.controller") //指定处理 controller 包//@RestControllerAdvice(basePackageClasses = BController.class) // 指定处理的 controller 类//@ControllerAdvice()public class GlobalMyExceptionHandler {    @ExceptionHandler(value = CustomException.class)//使用此注解来指定获取自定义异常类,返回给前端 json 格式错误数据    public ResultResponse handlerException(CustomException e){        return ResultResponse.builder().status(ResultCodeEnum.FAILURE.getCode()).message(e.getMessage()).build();    }}

03

具体代码中抛出我们自定义的异常

1、定义测试抛出异常的 controller

package com.wxw.springboot_exception.controller;import com.wxw.springboot_exception.Enums.ResultCodeEnum;import com.wxw.springboot_exception.base.Assert;import com.wxw.springboot_exception.base.ResultResponse;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.bind.annotation.RestController;/** * @author wuxiongwei * @date 2020/5/27 11:14 * @Description */@RestController@RequestMapping("/test")public class TestController {    @GetMapping("/test")    public ResultResponse test(){        //使用断言方法,取代 if 判断,同时抛出异常        Assert.assertTrue(1 == 1,"TEST测试异常");        return  ResultResponse.builder().status(ResultCodeEnum.SUCCESS.getCode()).message(ResultCodeEnum.SUCCESS.getMessage()).data("hello").build();    }}

2、使用 postman 请求接口,进行测试,可以看到我们测试的异常已经被以 json 数据返回出来了,证明我们自定义异常已经成功被拦截处理。

2eec760bcd11b685e41abf3ef5355ade.png

068a969a4d63dc1b7dd56438daf7d8c1.png

点击此处留言或查看留言

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值