Hibernate_Validator详细介绍
1. Hibernate Validator介绍
1.1 背景
在任何时候,当你要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情。应用程序必须通过某种手段来确保输入进来的数据从语义上来讲是正确的。在通常的情况下,应用程序是分层的,不同的层由不同的开发人员来完成。很多时候同样的数据验证逻辑会出现在不同的层,这样就会导致代码冗余和一些管理的问题,比如说语义的一致性等。为了避免这样的情况发生,最好是将验证逻辑与相应的域模型进行绑定。
Bean Validation 为 JavaBean 验证定义了相应的元数据模型和API。缺省的元数据是 Java Annotations,通过使用 XML 可以对原有的元数据信息进行覆盖和扩展。Bean Validation 是一个运行时的数据验证框架,在验证之后验证的错误信息会被马上返回。
Hibernate Validator 是 Bean Validation 的参考实现 . Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint。
1.2 Bean Validation 中的 constraint
1.3 Hibernate Validator 附加的 constraint
1.4 Hibernate Validator 的优点
a) 验证逻辑与业务逻辑之间进行了分离,降低了程序耦合度;
b) 统一且规范的验证方式,无需你再次编写重复的验证代码;
c) 你将更专注于你的业务,将这些繁琐的事情统统丢在一边。
2. Hibernate Validator实践
2.1 引入相关jar包
maven依赖:
2.2 SpringMvc中配置
本篇文章的demo是基于springmvc的,需要进行相关配置。
2.3 为JavaBean添加constraint
如图为User添加了几个constraint:对name添加了不为空和长度的约束;对sex添加了自定义的约束,后面会加以介绍;对role的约束为对象内嵌约束。JSR-303的校验是基于注解的,它内部已经定义好了一系列的限制注解,我们只需要把这些注解标记在需要验证的实体类的属性上或是其对应的get方法上。
2.4 自定义的 constraint
如图定义了一个ValidSex的注解,而且该注解上标注了@Constraint注解,使用@Constraint注解标注表明我们定义了一个用于限制的注解。@Constraint注解的validatedBy属性用于指定我们定义的当前限制类型需要被哪个ConstraintValidator进行校验。在上面代码中我们指定了ValidSex限制类型的校验类是ValidSexValidator。另外需要注意的是我们在定义自己的限制类型的注解时有三个属性是必须定义的,如上面代码所示的message、groups和payload属性。
2.5 自定义的 constraint实现类
如图,ConstraintValidator是使用了泛型的。它一共需要指定两种类型,第一个类型是对应的initialize方法的参数类型,第二个类型是对应的isValid方法的第一个参数类型。从上面的两个方法我们可以看出initialize方法是可以获取到当前的限制类型的属性,isValid方法是用于进行校验的。
2.6 对参数进行校验
在上图中我们可以看到我们定义了一个LoginController,该Controller有一个处理validator操作的处理器方法validator,它需要接收客户端发送的一个User对象,我们就是要利用前面的Validator对该User对象进行校验。首先我们可以看到我们validator方法接收的参数user是用@Valid进行标注的。另外我们的处理器方法必须给定包含Errors的参数,这可以是Errors本身,也可以是它的子类BindingResult,使用了Errors参数就是告诉Spring关于表单对象数据校验的错误将由我们自己来处理,否则Spring会直接抛出异常。这样当我们请求处理器方法validator时就会对user对象进行校验,并把相关的校验信息存放到当前的Errors对象中。接着我们就可以在我们的处理器方法中根据是否有校验异常信息来做不同的操作。在上面代码中我们定义了在有异常信息的时候就跳转到登陆页面。这样我们就可以在登陆页面上通过errors标签来展示这些错误信息了。
2.7 注意事项
a) 如果验证的是属性(getter 方法),那么必须遵从 Java Bean 的命名习惯(JavaBeans 规范);
b) 静态的字段和方法不能进行约束验证;
c) 约束适用于接口和基类;
d) 约束注解定义的目标元素可以是字段、属性或者类型等;
e) 可以在类或者接口上使用约束验证,它将对该类或实现该接口的实例进行状态验证;
f) 字段和属性均可以使用约束验证,但是不能将相同的约束重复声明在字段和相关属性(字段的 getter 方法)上。
结束语:善待身边每一个人,因为,是他们成就了你的人生。
以上是Hibernate_Validator详细介绍的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

不再需要pip?快来学习如何有效卸载pip!引言:pip是Python的包管理工具之一,它可以方便地安装、升级和卸载Python包。然而,有时候我们可能需要卸载pip,可能是因为我们希望使用其他的包管理工具,或者因为我们需要完全清除Python环境。本文将介绍如何有效地卸载pip,并提供具体的代码示例。一、卸载pip的方法下面将介绍两种常见的卸载pip的方法

深入学习matplotlib颜色表,需要具体代码示例一、引言matplotlib是一个功能强大的Python绘图库,它提供了丰富的绘图函数和工具,可以用于创建各种类型的图表。而颜色表(colormap)是matplotlib中一个重要的概念,它决定了图表的配色方案。深入学习matplotlib颜色表,将帮助我们更好地掌握matplotlib的绘图功能,使绘

从零开始学习Pygame:完整的安装和配置教程,需要具体代码示例引言:Pygame是一个使用Python编程语言开发的开源游戏开发库,它提供了丰富的功能和工具,使得开发者可以轻松创建各种类型的游戏。本文将带您从零开始学习Pygame,并提供完整的安装和配置教程,以及具体的代码示例,让您快速入门。第一部分:安装Python和Pygame首先,确保您的计算机上已

学习C语言的魅力:解锁程序员的潜力随着科技的不断发展,计算机编程已经成为了一个备受关注的领域。在众多编程语言中,C语言一直以来都备受程序员的喜爱。它的简单、高效以及广泛应用的特点,使得学习C语言成为了许多人进入编程领域的第一步。本文将讨论学习C语言的魅力,以及如何通过学习C语言来解锁程序员的潜力。首先,学习C语言的魅力在于其简洁性。相比其他编程语言而言,C语

在word中编辑文字内容时,有时会需要输入公式符号。有的小伙们不知道在word根号输入的方法,小面就让小编跟小伙伴们一起分享下word根号输入的方法教程。希望对小伙伴们有所帮助。首先,打开电脑上的Word软件,然后打开要编辑的文件,并将光标移动到需要插入根号的位置,参考下方的图片示例。2.选择【插入】,再选择符号里的【公式】。如下方的图片红色圈中部分内容所示:3.接着选择下方的【插入新公式】。如下方的图片红色圈中部分内容所示:4.选择【根式】,再选择合适的根号。如下方的图片红色圈中部分内容所示:

标题:从零开始学习Go语言中的main函数Go语言作为一种简洁、高效的编程语言,备受开发者青睐。在Go语言中,main函数是一个入口函数,每个Go程序都必须包含main函数作为程序的入口点。本文将从零开始介绍如何学习Go语言中的main函数,并提供具体的代码示例。一、首先,我们需要安装Go语言的开发环境。可以前往官方网站(https://golang.org

学习Go语言文档中的strconv.Atoi函数实现字符串转整数Go语言是一门强大而灵活的编程语言,其标准库中的strconv包提供了字符串转换的功能。在这篇文章中,我们将学习如何使用strconv.Atoi函数将字符串转换为整数。首先,我们需要了解strconv.Atoi函数的用途和声明。文档中对函数的描述如下:funcAtoi(sstring)(i

从零开始学习pip安装,快速掌握技巧,需要具体代码示例概述:pip是Python包管理工具,能够方便地安装、升级和管理Python包。对于Python开发者来说,掌握pip的使用技巧是非常重要的。本文将从零开始介绍pip的安装方法,并给出一些实用的技巧和具体的代码示例,帮助读者快速掌握pip的使用。一、安装pip在使用pip之前,首先需要安装pip。pip的
