首页  

数据校验 Java Bean Validation 2.0(JSR380) 实例     所属分类 java 浏览量 71
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<ConstraintViolation<User>> result = Validation.buildDefaultValidatorFactory().getValidator().validate(user); for(ConstraintViolation<User> item:result) { System.out.println(item.toString()); } user.setAge(20); user.setName("a"); result = Validation.buildDefaultValidatorFactory().getValidator().validate(user); for(ConstraintViolation<User> 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 核心技术