数据校验 Java Bean Validation 2.0(JSR380) 实例
所属分类 java
浏览量 81
JSR Java Specification Requests Java 规范提案
数据校验 JSR380 Bean Validation 2.0
https://www.jcp.org/en/egc/view?id=380
Bean Validation的参考实现
https://github.com/hibernate/hibernate-validator
Bean Validation 是一个通过配置注解来验证参数的框架,
它包含两部分 Bean Validation API(规范)和 Hibernate Validator(实现)
javax.validation:validation-api:2.0.1.Final
兼容性表格
BeanValidation/HibernateValidation/JDK/SpringBoot
1.1 5.4+ 6+ 1.5.x
2.0 6.0+ 8+ 2.0.x
Bean Validation 2.0的关注点(新特性)
对Java的最低版本要求是Java 8
支持容器的校验,通过TYPE_USE类型的注解实现对容器内容的约束 List< @Email String>
支持日期/时间的校验,@Past 和 @Future
拓展元数据(新增注解)
@Email,@NotEmpty,@NotBlank,@Positive, @PositiveOrZero,@Negative,@NegativeOrZero,@PastOrPresent和@FutureOrPresent
像@Email、@NotEmpty、@NotBlank之前是Hibernate额外提供的,2.0标准后hibernate标注为过期了
Bean Validation 2.0的唯一实现为Hibernate Validator
对于Hibernate Validator,它自己也扩展了一些注解支持
6.0以上版本新增(对应标准2.0版本):@UniqueElements、@ISBN、@CodePointLength
6.0以下版本可以使用
@URL、@ScriptAssert、@SafeHtml、@Range、@ParameterScriptAssert、@Mod11Check、
@Mod10Check、@LuhnCheck、@Length、@EAN、@Currency、@CreditCardNumber、
@ConstraintComposition、@DurationMax、@DurationMin、@REGON、@PESEL、@NIP、@TituloEleitoral、@CPF、@CNPJ
Hibernate Validator默认会校验完所有的属性,然后返回所有的验证失败信息。
开启fail fast mode后,只要有一个验证失败,则返回验证失败信息。
org.hibernate.validator:hibernate-validator:6.0.17.Final
@NotNull 被注释的元素必须不为null
@Null 被注释的元素必须为null
@AssertTrue 被注释的元素必须为true
@AssertFalse 被注释的元素必须为false
@URL 被注释的字符串必须是有效的URL
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Positive 被注释的元素必须是一个正数
@Negative 被注释的元素必须是一个负数
@Email 被注释的元素必须是电子邮件地址
@NotBlank 被注释的字符串不能为空(去除首尾空格后长度大于0)
@NotEmpty 被注释的字符串、集合、数组不能为null或空
@Valid 用于递归地对关联的对象进行验证
@Future 被注释的元素必须是一个将来的日期
@Past 被注释的元素必须是一个过去的日期
@Digits 被注释的元素必须是一个数字,其整数部分和小数部分必须在指定的位数之内
@SafeHtml 被注释的字符串必须是安全的HTML
@PositiveOrZero 被注释的元素必须是正数或零
@NegativeOrZero 被注释的元素必须是负数或零
@Size(min, max) 被注释的元素(String, Collection, Map, array)的大小必须在指定的范围之内
@Length(min, max) 被注释的字符串的长度必须在指定的范围之内
@Pattern(regexp) 被注释的元素必须符合指定的正则表达式
@PastOrPresent 被注释的元素必须是过去或现在的日期
@Range(min, max) 被注释的元素必须在指定的范围内(包括min和max)
@CreditCardNumber 被注释的字符串必须是信用卡号
org.springframework.boot:spring-boot-starter-Validation
spring-boot-starter-validation-2.7.10.jar
jakarta.validation-api-2.0.2.jar
hibernate-validator-6.2.5.Final.jar
@Validated
public class User {
@NotNull
@Size(min = 3, max = 20, message = "用户名长度必须在3到20个字符之间")
private String name;
@Min(value = 18)
private int age;
// getters and setters
}
import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import java.util.Set;
User user = new User();
Set> result = Validation.buildDefaultValidatorFactory().getValidator().validate(user);
for(ConstraintViolation item:result) {
System.out.println(item.toString());
}
user.setAge(20);
user.setName("a");
result = Validation.buildDefaultValidatorFactory().getValidator().validate(user);
for(ConstraintViolation item:result) {
System.out.println(item.toString());
}
user.setName("tiger");
result = Validation.buildDefaultValidatorFactory().getValidator().validate(user);
ConstraintViolationImpl{interpolatedMessage='不能为null', propertyPath=name, rootBeanClass=class demo.valid.User, messageTemplate='{javax.validation.constraints.NotNull.message}'}
ConstraintViolationImpl{interpolatedMessage='最小不能小于18', propertyPath=age, rootBeanClass=class demo.valid.User, messageTemplate='{javax.validation.constraints.Min.message}'}
ConstraintViolationImpl{interpolatedMessage='用户名长度必须在3到20个字符之间', propertyPath=name, rootBeanClass=class demo.valid.User, messageTemplate='用户名长度必须在3到20个字符之间'}
上一篇
下一篇
npm常用命令
PNPM常用命令
若依 vue3 开发环境 前后端搭建记录
vue3 vite prod 和 stage 区别
vue2 vue3 比较
vue3 核心技术