为什么要有数据校验?
数据校验 是非常常见的工作,在日常的开发中贯穿于代码的各个层次,在任何时候,当你要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情。
Java Bean Validation
JSR是Java Specification Requests的缩写,意思是Java 规范提案。关于数据校验这块,最新的是JSR380,也就是我们常说的Bean Validation 2.0。 Bean Validation是一个通过配置注解来验证参数的框架,它包含两部分Bean Validation API(规范)和Hibernate Validator(实现)。
使用validation-api
- 在pom中加入依赖
<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <!-- <version>1.1.0.Final</version> --> <version>2.0.1.Final</version> </dependency> - 也可以加入下面的依赖,2选1
<dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.17.Final</version> </dependency>
编写校验工具类
- 测试实体
@Data public class HelloDTO { @NotBlank private String name; @Min(value = 0) @Max(150) private int age; } - 校验工具类
@Slf4j public class ValidationUtils { private static Validator validator = Validation .byProvider(HibernateValidator.class) .configure() .failFast(true) .buildValidatorFactory() .getValidator(); public static <T> void validate(T obj) { Set<ConstraintViolation<T>> validate = validator.validate(obj); for (ConstraintViolation<T> violation : validate) { // TODO 注意:这里需根据实际业务进行自定义异常的抛出或做响应的操作 log.info("错误信息=[{}{}]", violation.getPropertyPath().toString(), violation.getMessage()); } } } - 测试类
public class ApplicationTest { public static void main(String[] args) { HelloDTO dto = new HelloDTO(); dto.setName("Tom"); dto.setAge(169); ValidationUtils.validate(dto); } }
结果
15:51:13.102 [main] INFO com.leaf1993.dry.goods.validation.ValidationUtils - 错误信息=[age最大不能超过150]