统一异常拦截
总体来说就是三个方面
- 自定义异常
- 抛出异常
- 拦截异常
自定义异常
首先自定义一个异常类型的枚举类(个人喜好随意)
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 - 密码不能为空