10. 实战脚手架搭建-Hibernate Validator 详解
10.1.Hibernate Validator 简介
平时项目中,难免需要对参数 进行一些参数正确性的校验,这些校验出现在业务代码中,让我们的业务代码显得臃肿,而且,频繁的编写这类参数校验代码很无聊。鉴于此,觉得 Hibernate Validator 框架刚好解决了这些问题,可以很优雅的方式实现参数的校验,让业务代码和校验逻辑分开,不再编写重复的校验逻辑。
10.2 Hibernate Validator 的作用
- 验证逻辑与业务逻辑之间进行了分离,降低了程序耦合度;
- 统一且规范的验证方式,无需你再次编写重复的验证代码;
- 你将更专注于你的业务,将这些繁琐的事情统统丢在一边。
10.3 Hibernate Validator 的使用
项目中,主要用于接口api 的入参校验和 封装工具类 在代码中校验两种使用方式。
10.4 常用的注解
- @NotEmpty 用在集合类上面
- @NotBlank 用在String上面
- @NotNull 用在基本数据类型上
- @Valid:启用校验
10.5 测试
10.5.1 创建 TestReqVO
package com.yingxue.lesson.vo.req;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
* @ClassName: TestReqVO
* TODO:类文件简单描述
* @Author: 小霍
* @UpdateUser: 小霍
* @Version: 0.0.1
*/
@Data
public class TestReqVO {
@ApiModelProperty(value = "名称")
@NotBlank(message = "名称不能为空")
private String name;
@NotNull(message = "age 不能为空")
@ApiModelProperty(value = "年龄")
private Integer age;
@NotEmpty(message = "id 集合不能为空")
@ApiModelProperty(value = "id集合")
private List<String> ids;
}
10.5.2 新增测试接口
修改 TestController.java 加入如下方法
@PostMapping("/valid/error")
@ApiOperation(value = "测试Validator抛出业务异常接口")
public DataResult testValid(@RequestBody @Valid TestReqVO vo){
DataResult result=DataResult.success();
return result;
}
10.6全局捕获校验抛出异常
修改 RestExceptionHandler.java 加入如下代码
/**
* 处理validation 框架异常
* @Author: 小霍
* @UpdateUser:
* @Version: 0.0.1
* @param e
* @return com.yingxue.lesson.utils.DataResult<T>
* @throws
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
DataResult methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
log.error("methodArgumentNotValidExceptionHandler bindingResult.allErrors():{},exception:{}", e.getBindingResult().getAllErrors(), e);
List<ObjectError> errors = e.getBindingResult().getAllErrors();
return createValidExceptionResp(errors);
}
private DataResult createValidExceptionResp(List<ObjectError> errors) {
String[] msgs = new String[errors.size()];
int i = 0;
for (ObjectError error : errors) {
msgs[i] = error.getDefaultMessage();
log.info("msg={}",msgs[i]);
i++;
}
return DataResult.getResult(BaseResponseCode.METHOD_IDENTITY_ERROR.getCode(), msgs[0]);
}