Spring 统一异常拦截与validation参数校验

统一异常拦截

总体来说就是三个方面

 - 自定义异常
 - 抛出异常
 - 拦截异常

自定义异常

首先自定义一个异常类型的枚举类(个人喜好随意)

public enum ExceptionType {

  TESTEXCEPTION(114514,"测试异常");

  public final Integer type;
  public final String value;

  ExceptionType(Integer type, String value) {
    this.type = type;
    this.value = value;
  }
}

然后再定义自己的异常类

public class CustomException extends RuntimeException{
  private final ExceptionType exceptionType;

  public CustomException(ExceptionType exceptionType) {
    super(exceptionType.value);
    this.exceptionType = exceptionType;
  }
}


异常全局拦截

//对RestController进行功能增强,即实现对controller中异常的拦截
@RestControllerAdvice
public class GlobalExceptionHandler {

  //要拦截的异常类型
  @ExceptionHandler(CustomException.class)
  //拦截完直接返回给前端
  @ResponseBody
  public String customExceptionHandler(CustomException customException){
    return customException.getMessage();
  }
}

抛出异常(进行一个包装)

这一步不做也行,包装一下就是看起来美观一点(不用看见一堆 throw)
 

public class ThrowException {
  public static CustomException type(ExceptionType exceptionType){
    throw new CustomException(exceptionType);
  }
}

测试运行

  @GetMapping("exception")
  public String exceptionTest(){
    ThrowException.type(ExceptionType.TESTEXCEPTION);
    return "正确返回";
  }


结果



validation参数校验

整合上面的统一异常拦截

总体思想就是通过全局异常拦截 MethodArgumentNotValidException

增加新的异常拦截

  @ExceptionHandler(MethodArgumentNotValidException.class)
  @ResponseBody
  public String customExceptionHandler(MethodArgumentNotValidException validException){
    //所需信息在 BindingResult 中,根据自己需求返回
    BindingResult result = validException.getBindingResult();
    for (FieldError fieldError : result.getFieldErrors()) {
      log.info(fieldError.getField());
      log.info(fieldError.getDefaultMessage());
    }
    return "返回";
  }

测试参数

@Data
public class QueryParams {

  @NotBlank(message = "姓名不能为空")
  private String name;

  @NotBlank(message = "密码不能为空")
  @Length(min = 6,max = 10)
  private String password;
}

测试运行

  @GetMapping("params")
  //只需要在参数前面添加 @Valid 注解即可对参数进行校验
  public String paramsTest(@Valid @RequestBody QueryParams queryParams){
    return "正确返回";
  }

结果

{
  "name": "",
  "password": ""
}

==>

INFO  GlobalExceptionHandler:33 - password
INFO  GlobalExceptionHandler:34 - 长度需要在6和10之间
INFO  GlobalExceptionHandler:33 - name
INFO  GlobalExceptionHandler:34 - 姓名不能为空
INFO  GlobalExceptionHandler:33 - password
INFO  GlobalExceptionHandler:34 - 密码不能为空

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值