SprinBoot 全局异常处理+自定义注解+参数校验
0. 背景
-
接口的请求参数校验会进行各种判断,写起来很繁琐,各种判空判断长度以及正则判断等等,逻辑简单,却又不得不做
-
接口自定义异常抛出后需要一个异常处理器去处理,而不是直接将异常返回给前端
-
不是所有的接口方法都需要进行参数校验的,所以可以使用自定义注解,只处理有注解标注的方法
1. 环境
-
SpringBoot 2.2.5.RELEASE
-
JDK 1.8.0_271
2. 编码
2.1 接口
2.2 自定义注解
2.3 参数校验异常处理器
2.4 全局异常处理器
2.5 自定义异常ApiException
3. 说明
3.1 自定义注解
- 注解到需要参数校验的方法上,就可以被参数校验异常处理器扫描到并进行相应处理.
- 需要注意的是,被注解的方法,需要参数使用@Valid注解进行参数校验,同时不要使用BindingResult接收校验结果,使方法抛出指定异常才可以被捕获处理.
3.2 自定义接口异常
-
进行一些业务处理或者参数特定的校验的时候,如果失败,可以抛出该异常.
-
异常会被全局异常处理器捕获,并将异常码,异常信息封装成统一的对象返回给接口调用者.
3.3 参数校验异常处理器
- 扫描特定注解的方法,这里是RestController下的ParamValidate注解的方法.
- 捕获校验抛出的特定异常MethodArgumentNotValidException,可能存在多条校验不通过的信息,这里只返回第一个即可.
3.4 全局异常处理器
-
apiExceptionHandler处理接口自定义异常,包装为统一返回对象返回即可.
-
parameterMissingExceptionHandler处理参数丢失情况,比如本文中的接口,需要一个userId,如果这个参数没有传,就会抛出这个异常,会被全局异常处理捕获到并进行更友好的返回.
-
parameterBodyMissingExceptionHandler处理请求体丢失的情况,比如本文中的接口,如果发起POST请求的时候,请求体是空的,就会抛出这个异常,会被全局异常处理捕获并进行更友好的返回.