Hibernate Validator.docx
- 文档编号:11405238
- 上传时间:2023-02-28
- 格式:DOCX
- 页数:15
- 大小:21.53KB
Hibernate Validator.docx
《Hibernate Validator.docx》由会员分享,可在线阅读,更多相关《Hibernate Validator.docx(15页珍藏版)》请在冰豆网上搜索。
HibernateValidator
HibernateValidator
HibernateValidatorJSR303的参考实现使用指南由HardyFerentschik和GunnarMorlingandthankstoShaozhuangLiu4.2.0.Final版权?
2009-2011RedHat,Inc.&GunnarMorlingJune20,2011序言1.开始入门1.1.第一个Maven项目1.2.添加约束1.3.校验约束1.4.更进一步2.Validationstepbystep2.1.定义约束2.1.1.字段级(fieldlevel)约束2.1.2.属性级别约束2.1.3.类级别约束2.1.4.约束继承2.1.5.对象图2.2.校验约束2.2.1.获取一个Validator的实例2.2.2.Validator中的方法2.2.3.ConstraintViolation中的方法2.2.4.验证失败提示信息解析2.3.校验组2.3.1.校验组序列2.3.2.对一个类重定义其默认校验组2.4.内置的约束条件2.4.1.BeanValidationconstraints2.4.2.Additionalconstraints3.创建自己的约束规则3.1.创建一个简单的约束条件3.1.1.约束标注3.1.2.约束校验器3.1.3.校验错误信息3.1.4.应用约束条件3.2.约束条件组合4.XMLconfiguration4.1.validation.xml4.2.映射约束5.Bootstrapping5.1.Configuration和ValidatorFactory5.2.ValidationProviderResolver5.3.MessageInterpolator5.3.1.ResourceBundleLocator5.4.TraversableResolver5.5.ConstraintValidatorFactory6.MetadataAPI6.1.BeanDescriptor6.2.PropertyDescriptor6.3.ElementDescriptor6.4.ConstraintDescriptor7.与其他框架集成7.1.OSGi7.2.与数据库集成校验7.3.ORM集成7.3.1.基于Hibernate事件模型的校验7.3.2.JPA7.4.展示层校验8.HibernateValidatorSpecifics8.1.PublicAPI8.2.Failfastmode8.3.Methodvalidation8.3.1.Definingmethod-levelconstraints8.3.2.Evaluatingmethod-levelconstraints8.3.3.Retrievingmethod-levelconstraintmetadata8.4.Programmaticconstraintdefinition8.5.Booleancompositionforconstraintcomposition9.AnnotationProcessor9.1.前提条件9.2.特性9.3.配置项9.4.使用标注处理器9.4.1.命令行编译9.4.2.IDE集成9.5.已知问题10.进一步阅读序言数据校验是任何一个应用程序都会用到的功能,无论是显示层还是持久层.通常,相同的校验逻辑会分散在各个层中,这样,不仅浪费了时间还会导致错误的发生(译注:
重复代码).为了避免重复,开发人员经常会把这些校验逻辑直接写在领域模型里面,但是这样又把领域模型代码和校验代码混杂在了一起,而这些校验逻辑更应该是描述领域模型的元数据.JSR303-BeanValidation-为实体验证定义了元数据模型和API.默认的元数据模型是通过Annotations来描述的,但是也可以使用XML来重载或者扩展.BeanValidationAPI并不局限于应用程序的某一层或者哪种编程模型,例如,如图所示,BeanValidation可以被用在任何一层,或者是像类似Swing的富客户端程序中.HibernateValidatoristhereferenceimplementationofthisJSR.TheimplementationitselfaswellastheBeanValidationAPIandTCKareallprovidedanddistributedundertheApacheSoftwareLicense2.0.第1章开始入门1.1.第一个Maven项目1.2.添加约束1.3.校验约束1.4.更进一步本章将会告诉你如何使用HibernateValidator,在开始之前,你需要准备好下面的环境:
AJDK>=5ApacheMaven网络连接(Maven需要通过互联网下载所需的类库)Aproperlyconfiguredremoterepository.Addthefollowingtoyoursettings.xml:
例1.1.ConfiguringtheJBossMavenrepository<repositories>
<repository>
<id>jboss-public-repository-group</id>
<url>https:
//repository.jboss.org/nexus/content/groups/public-jboss</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
Moreinformationaboutsettings.xmlcanbefoundintheMavenLocalSettingsModel.注意HibernateValidatorusesJAXBforXMLparsing.JAXBispartoftheJavaClassLibrarysinceJava6whichmeansthatifyourunHibernateValidatorwithJava5youwillhavetoaddadditionalJAXBdependencies.UsingMavenyouhavetoaddthefollowingdependencies:
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.1.12</version>
</dependency>
ifyouareusingtheSourceForgepackageyoufindthenecessarylibrariesinthelib/jdk5directory.IncaseyouarenotusingtheXMLconfigurationyoucanalsodisableitexplicitlybycallingConfiguration.ignoreXmlConfiguration()duringValidationFactorycreation.InthiscasetheJAXBdependenciesarenotneeded.1.1.第一个Maven项目使用Mavenarchetype插件来创建一个新的Maven项目例1.2.使用Mavenarchetype插件来创建一个简单的基于HibernateValidator的项目mvnarchetype:
generate-DarchetypeGroupId=org.hibernate-DarchetypeArtifactId=hibernate-validator-quickstart-archetype-DarchetypeVersion=4.2.0.Final-DarchetypeRepository=http:
//repository.jboss.org/nexus/content/groups/public-jboss/-DgroupId=com.mycompany-DartifactId=hv-quickstart
Maven将会把你的项目创建在hv-quickstart目录中.进入这个目录并且执行:
mvntest这样,Maven会编译示例代码并且运行单元测试,接下来,让我们看看生成的代码.注意Fromversion4.2.0.Beta2,themavencommandmvnarchetype:
createwillbenolongersupportedandwillfail.Youshouldusethecommanddescribedintheabovelisting.Ifyouwantmoredetails,lookatMavenArchetypepluginpage.1.2.添加约束在你喜欢的IDE中打开这个项目中的Car类:
例1.3.带约束性标注(annotatedwithconstraints)的Car类packagecom.mycompany;
importjavax.validation.constraints.Min;
importjavax.validation.constraints.NotNull;
importjavax.validation.constraints.Size;
publicclassCar{
@NotNull
privateStringmanufacturer;
@NotNull
@Size(min=2,max=14)
privateStringlicensePlate;
@Min
(2)
privateintseatCount;
publicCar(Stringmanufacturer,StringlicencePlate,intseatCount){
this.manufacturer=manufacturer;
this.licensePlate=licencePlate;
this.seatCount=seatCount;
}
//gettersandsetters...
}
@NotNull,@Sizeand@Min就是上面所属的约束性标注(constraintannotations),我们就是使用它们来声明约束,例如在Car的字段中我们可以看到:
manufacturer永远不能为nulllicensePlate永远不能为null,并且它的值字符串的长度要在2到14之间seatCount的值要不能小于21.3.校验约束我们需要使用Validator来对上面的那些约束进行校验.让我们来看看CarTest这个类:
例1.4.在CarTest中使用校验packagecom.mycompany;
importstaticorg.junit.Assert.*;
importjava.util.Set;
importjavax.validation.ConstraintViolation;
importjavax.validation.Validation;
importjavax.validation.Validator;
importjavax.validation.ValidatorFactory;
importorg.junit.BeforeClass;
importorg.junit.Test;
publicclassCarTest{
privatestaticValidatorvalidator;
@BeforeClass
publicstaticvoidsetUp(){
ValidatorFactoryfactory=Validation.buildDefaultValidatorFactory();
validator=factory.getValidator();
}
@Test
publicvoidmanufacturerIsNull(){
Carcar=newCar(null,"DD-AB-123",4);
Set<ConstraintViolation<Car>>constraintViolations=
validator.validate(car);
assertEquals(1,constraintViolations.size());
assertEquals("maynotbenull",constraintViolations.iterator().next().getMessage());
}
@Test
publicvoidlicensePlateTooShort(){
Carcar=newCar("Morris","D",4);
Set<ConstraintViolation<Car>>constraintViolations=
validator.validate(car);
assertEquals(1,constraintViolations.size());
assertEquals("sizemustbebetween2and14",constraintViolations.iterator().next().getMessage());
}
@Test
publicvoidseatCountTooLow(){
Carcar=newCar("Morris","DD-AB-123",1);
Set<ConstraintViolation<Car>>constraintViolations=
validator.validate(car);
assertEquals(1,constraintViolations.size());
assertEquals("mustbegreaterthanorequalto2",constraintViolations.iterator().next().getMessage());
}
@Test
publicvoidcarIsValid(){
Carcar=newCar("Morris","DD-AB-123",2);
Set<ConstraintViolation<Car>>constraintViolations=
validator.validate(car);
assertEquals(0,constraintViolations.size());
}
}
在setUp()方法中,我们通过ValidatorFactory得到了一个Validator的实例.Validator是线程安全的,并且可以重复使用,所以我们把它保存成一个类变量.现在我们可以在test方法中使用这个validator的实例来校验不同的car实例了.validate()方法会返回一个set的ConstraintViolation的实例的集合,我们可以通过遍历它来查看有哪些验证错误.前面三个测试用例显示了一些预期的校验约束:
在manufacturerIsNull()中可以看到manufacturer违反了@NotNull约束licensePlateTooShort()中的licensePlate违反了@Size约束而seatCountTooLow()中则导致seatCount违反了@Min约束如果一个对象没有校验出问题的话,那么validate()会返回一个空的set对象.注意,我们只使用了BeanValidationAPI中的packagejavax.validation中的类,并没有直接调用参考实现中的任何类,所以,没有任何问题如果切换到其他的实现.1.4.更进一步Thatconcludesour5minutetourthroughtheworldofHibernateValidator.Continueexploringthecodeexamplesorlookatfurtherexamplesreferencedin第10章进一步阅读.TodeepenyourunderstandingofHibernateValidatorjustcontinuereading第2章Validationstepbystep.Incaseyourapplicationhasspecificvalidationrequirementshavealookat第3章创建自己的约束规则.第2章Validationstepbystep2.1.定义约束2.1.1.字段级(fieldlevel)约束2.1.2.属性级别约束2.1.3.类级别约束2.1.4.约束继承2.1.5.对象图2.2.校验约束2.2.1.获取一个Validator的实例2.2.2.Validator中的方法2.2.3.ConstraintViolation中的方法2.2.4.验证失败提示信息解析2.3.校验组2.3.1.校验组序列2.3.2.对一个类重定义其默认校验组2.4.内置的约束条件2.4.1.BeanValidationconstraints2.4.2.Additionalconstraints在本章中,我们会详细的介绍如何使用HibernateValidator来对一个给定的实体模型进行验证.还会介绍BeanValidation规范提供了哪些默认的约束条件和HibernateValidator提供了哪些额外的.让我们先从如何给一个实体添加约束开始.2.1.定义约束BeanValidation的约束是通过Java注解(annotations)来标注的.在本节中,我们会介绍如何使用这些注解(annotations)来标注一个实体模型.并且,我们会区分三种不通的注解(annotations)类型.注意不是所有的约束都能够被用在所有的类结构上.事实上,没有任何定义在BeanValidation规范中的约束可以被用在class上.约束定义中的java.lang.annotation.Target属性定义了这个约束能够被使用在哪个层次结构上.详细信息请参考第3章创建自己的约束规则.2.1.1.字段级(fieldlevel)约束约束条件能够被标注在类的字段上面,请参考示例例2.1“字段级(fieldlevel)约束”例2.1.字段级(fieldlevel)约束packagecom.mycompany;
importjavax.validation.constraints.NotNull;
publicclassCar{
@NotNull
privateStringmanufacturer;
@AssertTrue
privatebooleanisRegistered;
publicCar(Stringmanufacturer,booleanisRegistered){
super();
this.manufacturer=manufacturer;
this.isRegistered=isRegistered;
}
}
当约束被定义在字段上的时候,这个字段的值是通过字段访问策略来获取并验证的.也就是说BeanValidation的实现者会直接访问这个实例变量而不会调用属性的访问器(getter)即使这个方法存在.注意这个字段的访问级别(private,protected或者public)对此没有影响.注意静态字段或者属性是不会被校验的.2.1.2.属性级别约束如果你的模型遵循JavaBeans规范的话,你还可以把约束标注在属性上.例2.2“属性级约束”和例2.1“字段级(fieldlevel)约束”的唯一不同就是它的约束是定义在属性级别上的.注意如果要定义约束在属性级别上的话,那么只能定义在访问器(getter)上面,不能定义在修改器(setter)上.例2.2.属性级约束packagecom.mycompany;
importjavax.validation.constraints.AssertTrue;
importjavax.validation.constraints.NotNull;
publicclassCar{
privateStringmanufacturer;
privatebooleanisRegistered;
publicCar(Stringmanufacturer,booleanisRegistered){
super();
this.manufacturer=manufacturer;
this.isRegistered=isRegistered;
}
@NotNull
publicStringgetManufacturer(){
returnmanufacturer;
}
publicvoidsetManufacturer(Stringmanufacturer){
this.manufacturer=manufacturer;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Hibernate Validator
