Java@Valid注解详解校验实体属性(JavaBeanValidation)
Spring @Valid 注解校验实体属性
1 @Valid 介绍
1.1 前⾔
在我们⽇常开发中,数据校验的实现是⼀件⽐较痛苦的事情,繁琐且⽆趣,对于⼀般的业务⽽⾔,极少出现⼀些过于复杂的校验,常常都是⾮空,长度,最⼤最⼩值,正则,数据关联,定值等等。我在开发过程中为了减少我写这些代码的coding成本,由此认识了
springboot aop
javax.validation包下的 @Valid 注解 和 Java 的 Bean Validation 规范。
1.2 Bean Validation
⾸先了解下JSR(Java Specification Requests)
JSR:Java Specification Requests的缩写,意思是Java 规范提案。是指向JCP(Java Community Process)提出新增⼀个标准化技术规范的正式请求。任何⼈都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的⼀个重要标准。
Bean Validation 是⼀个运⾏时的数据验证框架,在验证之后验证的错误信息会被马上返回。
Java 在2009年的 JAVAEE 6 中发布了 JSR303以及javax下的validation包内容。
这项⼯作的主要⽬标是为java应⽤程序开发⼈员提供 基于java对象的 约束(constraints)声明 和 对约束的验证⼯具(validator),以及约束元数据存储库和查询API。
但是该内容并没有具体的实现, Hibernate-Validator框架 提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有⼀些附加的 constraint。
注意:此处的Hibernate 不是 Hibernate ORM
后续关于Bean Validation 的规范提案 和 各个版本的实现 陆续得以迭代,各个版本的信息如下:
Bean Validation Version release year JSR Version Hibernate impl version apache BVal impl version Bean Validation 1.02009年JSR 303Hibernate-Validator-4.3.1.Final org.apache.bval 0.5
Bean Validation 1.12013年JSR 349Hibernate-Validator-5.1.1.Final org.apache.bval 1.1.2
Bean Validation 2.02017年JSR 380Hibernate-Validator-6.0.1.Final org.apache.bval 2.0.3(最新版本)本⽂主要基于 Hibernate-Validator 框架的实现为主。
1.3 关于validation包
其中 straints包下是 bean validation ⽀持的约束,以注解的形式使⽤。
1.3 关于Spring Hibernate Validator⽀持的约束集信息(constraints)
截取⾃ IBM
表 1. Bean Validation 中内置的 constraint
表 2. Hibernate Validator 附加的 constraint
2 简单的使⽤
2.1配置项
2.1.1 maven – jar包引⼊
如果使⽤springMVC ,需要在 pom⽂件中引⼊对应的jar包。
<!--        hibernate.validator jar包-->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.17.Final</version>
</dependency>
这⾥不需要引⼊ javax.validation包,hibernate-validator框架中已经有引⼊了。
如果使⽤springboot,笔者使⽤的 2.1.7.RELEASE 版本,其中 spring-boot-starter-web 包中已经引⼊了 hibernate-validator 6.0.17.RELEASE了,不需要我们⼿动添加。
如果使⽤的⾮maven项⽬,需要下载对应的jar引⼊到项⽬中。
2.1.2 SpringMVC 配置
2.2 实现⽅式
2.2.1 @Valid + BindingResult + straints
BindingResult 是 spring 对于 Hibernate-Validator的进⼀步封装,主要处理 约束违反信息 的处理。也就是当 判断 校验不通过时 所获取的 默认的或者⾃定义的 错误信息。
使⽤ @Valid 结合 BindingResult实例,Spring将对被注解的实体进⾏约束校验,原理是AOP。
2.2.2 validator.validate()
springboot ⾃动将 ValidatorFactory 加载到了IOC容器中,不需要进⾏配置(注意:SpringMVC 需要
进⾏配置)。我们可以使⽤⾃动注⼊的⽅式获取 ValidatorFactory接⼝的实现的实例,进⽽获取 Validator接⼝的实现的实例,调⽤.validate(T var1, Class<?>… var2)⽅法对 java bean 进⾏约束检验。基于此,还可以⽤作AOP切⾯的开发。validator接⼝源码<!--
配置中需要注意的地⽅:
LocalValidatorFactoryBean :
validationMessageSource 通过set ⽅法注⼊,然后转换为MessageInterpolator 对象,如果不配置validationMessageSource 信息源,那么会使⽤默认的信息源Hib <bean id ="validator " class ="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean ">
<property name ="providerClass " value ="org.hibernate.validator.HibernateValidator " />
<property name ="validationMessageSource " ref ="hibernate_validator_messages "/>
</bean >
ValidatorFactory ⼯⼚接⼝源码
2.2.3 代码⽰例
下⾯我们⽤⼀个简单的⽰例来完成上诉提到的两种实现。
⾸先我们创建⼀个 简单的 po 类,也就是我们的业务实体类。
假设⼀个后台管理系统的职员信息管理模块,需要新增员⼯信息。新建⼀个Employee类 ⽤于 封装 职员的基础信息
package  javax .validation ;
import  java .util .Set ;
import  javax .validation .executable .ExecutableValidator ;
import  javax .validation .metadata .BeanDescriptor ;
public  interface  Validator {
<T > Set <ConstraintViolation <T >> validate (T var1, Class <?>... var2);
<T > Set <ConstraintViolation <T >> validateProperty (T var1, String var2, Class <?>... var3);
<T > Set <ConstraintViolation <T >> validateValue (Class <T > var1, String var2, Object var3, Class <?>... var4);    BeanDescriptor getConstraintsForClass (Class <?> var1);
<T > T unwrap (Class <T > var1);
ExecutableValidator forExecutables ();
}
package  javax .validation ;
public  interface  ValidatorFactory extends  AutoCloseable {
Validator getValidator ();
ValidatorContext usingContext ();
MessageInterpolator getMessageInterpolator ();
TraversableResolver getTraversableResolver ();
ConstraintValidatorFactory getConstraintValidatorFactory ();
ParameterNameProvider getParameterNameProvider ();
ClockProvider getClockProvider ();
<T > T unwrap (Class <T > var1);
void  close ();
}
package  com .onesport .kern .beanValidationTest .dao ;
//看包名就知道这个是hibernate 附加的constraints
import  org .hibernate .validator .constraints .Length ;
//straints 包下所⽀持的⼀些约束类型
import  javax .validation .constraints .NotNull ;
import  javax .validation .constraints .Past ;
import  javax .validation .constraints .Pattern ;
import  java .util .Date ;
/**
* @author Kern
* @Title: Employee
* @ProjectName kern-demo

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。