今天继续为大家分享在工作中如何优雅的校验接口的参数的合法性以及如何统一处理接口返回的json格式。每个字都是干货,原创不易,分享不易。
validation主要是校验用户提交的数据的合法性,比如是否为空,密码是否符合规则,邮箱格式是否正确等等,校验框架比较多,用的比较多的是hibernate-validator, 也支持国际化,也可以自定义校验类型的注解,这里只是简单地演示校验框架在Spring Boot中的简单集成,要想了解更多可以参考 hibernate-validator。
1. pom.xml
<dependency>
2. dto
public
3. controller
import org.springframework.validation.BindingResult;
4. 去掉BindingResult参数
每个接口都需要BindingResult参数,而且每个接口都需要处理错误信息,这样增加一个参数也不优雅,处理错误信息代码量也很重复。如果去掉BindingResult参数,系统就会报错MethodArgumentNotValidException,我们只需要使用全局异常来捕获该错误,处理一下就可以省略传BindingResult参数了。
@RestController
@RestControllerAdvice 用于拦截所有的@RestController
@RestControllerAdvice
5. 统一返回格式
错误码枚举
@Getter
自定义异常。
@Getter
定义返回格式。
@Getter
全局异常处理器增加对APIException的拦截,并修改异常时返回的数据格式。
@RestControllerAdvice
SimpleController 增加一个抛出异常的方法。
@RestController
报错返回的格式。
不报错,返回的格式。
6. 去掉接口中的Response包装
@RestControllerAdvice既可以全局拦截异常也可拦截指定包下正常的返回值,可以对返回值进行修改。
@RestControllerAdvice(basePackages = {
@RestController
7. 每个校验错误都对应不同的错误码
@Retention(RetentionPolicy.RUNTIME)
@Data
校验异常获取注解中的错误码。
@ExceptionHandler(MethodArgumentNotValidException.class)
8. 个别接口不统一包装响应
有时候第三方接口回调我们的接口,我们的接口必须按照第三方定义的返回格式来,此时第三方不一定和我们自己的返回格式一样,所以要提供一种可以绕过统一包装的方式。
@Retention(RetentionPolicy.RUNTIME)
@RestController
ResponseControllerAdvice 增加一个不包装的条件,配置了@NotResponseWrap注解就跳过包装。
@Override