Spring MVC自定义验证注释

在上一教程中,我展示了如何使用注释来验证表单 。 这对于简单的验证非常有用,但是最终,您需要验证一些现成的注释中没有的自定义规则。 例如,如果您需要根据输入的出生日期来验证用户已超过21岁,或者可能需要验证用户的电话区号在美国内布拉斯加州,该怎么办。 本教程包含完整的源代码,将显示如何创建自定义验证注释,您可以在上一教程中探讨的JSR-303和Hibernate Validator注释中使用这些注释。

如果您想继续,可以在GitHub上获取本教程的代码。

对于此示例,假设我们有一个带有电话号码字段和生日日期字段的表单,并且我们要验证电话号码是否有效(简单检查格式)以及该用户出生于1989年。支持这些的现成的注释(据我所知),因此我们将编写自定义验证注释,然后可以重复使用它们,就像内置的JSR-303一样。

完成后,我们将注释应用于表单对象,如下所示:

public class Subscriber {...@Phoneprivate String phone;@Year(1989)private Date birthday;// getters setters ...}

让我们开始使用@Phone批注。 我们将创建两个类: Phone (即批注)和PhoneConstraintValidator其中包含验证逻辑)。 第一步是创建Phone注释类:

@Documented
@Constraint(validatedBy = PhoneConstraintValidator.class)
@Target( { ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface Phone {String message() default "{Phone}";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};}

上面的代码大部分只是样板。 JSR-303规范要求使用批注中的三种方法。 如果我们的注释接受了任何参数,那么我们将在那里定义为方法。 我们将在本教程后面的下一个批注中看到这一点。 上面的类中最重要的部分是该类上的@Constraint批注,该批注指定我们将使用PhoneConstraintValidator类进行验证逻辑。 message()方法定义如何解析消息。 通过指定“ {Phone}”,我们可以使用Phone键覆盖Spring资源束中的消息(有关消息的详细信息,请参见我的其他验证教程 )。

现在,我们定义约束验证器:

public class PhoneConstraintValidator implements ConstraintValidator<Phone, String> {@Overridepublic void initialize(Phone phone) { }@Overridepublic boolean isValid(String phoneField, ConstraintValidatorContext cxt) {if(phoneField == null) {return false;}return phoneField.matches("[0-9()-\.]*");}}

让我们看一下上面的代码。 超类的模板化类型有两种类型:它支持的注释的类型和它验证的属性的类型(在此示例中为Phone,String)。

“ initialize”方法在此处为空,但可用于保存注释中的数据,如下面定义其他注释时所见。

最后,实际的逻辑发生在“ isValid”方法中。 字段值作为第一个参数传入,我们在这里进行验证。 如您所见,我只是在验证电话号码仅包含数字,括号或破折号。

就是这个注解! 现在可以在字段上使用批注,如上面在我们的表单对象上所示。

现在,让我们做第二个注释。 这个有点人为的-我们将验证用户的生日是在1989年。不过,将来,我们可能需要验证日期在其他年份,因此,我们而不是创建用于验证年份为1989年的注释。将使用一个参数来指定要验证的年份。 用法示例:

@Year(1989)
private Date birthDate;

现在,注释:

@Documented
@Constraint(validatedBy = YearConstraintValidator.class)
@Target( { ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface Year {int value();String message() default "{Year}";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};}

注意“ value()”方法。 这暴露了注释的“值”参数,我们将使用它传递注释应针对的年份。 其余代码大部分都是样板

现在,约束验证器:

public class YearConstraintValidator implements ConstraintValidator<Year, Date> {private int annotationYear;@Overridepublic void initialize(Year year) {this.annotationYear = year.value();}@Overridepublic boolean isValid(Date target, ConstraintValidatorContext cxt) {if(target == null) {return true;}Calendar c = Calendar.getInstance();c.setTime(target);int fieldYear = c.get(Calendar.YEAR);return fieldYear == annotationYear;}}

首先要注意的是,这一次,我们将传递到批注中的年份保存为约束验证器类的成员变量。 这使我们可以在“ isValid”方法中访问该值。

isValid方法是非常简单的代码,可以与令人讨厌的Date / Calendar API进行搏斗,以验证带注释的字段的值是否与指定的验证注释的年份匹配(我可以在某个时候使用JodaTime发布示例)。 现在,如果我们启动我们的Web应用程序,我们的两个验证就位并可以使用!

自定义验证示例e1372733063855

就这样。 我有想念吗? 有问题吗? 在评论中让我知道。

全文: ZIP , GitHub
要运行本教程中的代码:必须已安装Gradle 。 克隆GitHub存储库或下载ZIP并解压缩。 打开命令提示符以编码位置。 运行gradle jettyRunWar。 在浏览器中导航到http:// localhost:8080。

参考:我们的JCG合作伙伴 Steve Hanson在CodeTutr博客上提供的Spring MVC自定义验证注释 。

翻译自: https://www.javacodegeeks.com/2013/07/spring-mvc-custom-validation-annotations.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367654.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前期

转载于:https://www.cnblogs.com/joker157/p/8618091.html

0基础能学mysql数据库吗_mysql学习入门:零基础如何使用mysql创建数据库表?

零基础如何自学Mysql创建数据库&#xff0c;是Mysql学习者必经之路&#xff0c;Mysql是受欢迎的关系数据库管理系统,WEB应用方面MySQL是很好的RDBMS应用软件之一。如何使用Mysql创建数据库表&#xff0c;打开Mysql学习进阶大门&#xff0c;就是今天MYSQL学习教程丁光辉博客认为…

vue跨域解决及打包

打包之前需要修改如下配置文件&#xff1a; 配置文件一&#xff1a;build>>>utils.js (修改publicPath:"../../" , 这样写是处理打包后找不到静态文件&#xff08;图片路径失效&#xff09;的问题) 配置文件二&#xff1a;config>>>index.js(修改a…

Bootstrap中实现图片圆角效果

Bootstrap 对图片的支持。Bootstrap 提供了三个可对图片应用简单样式的 class&#xff1a; .img-rounded&#xff1a;添加 border-radius:6px 来获得图片圆角。.img-circle&#xff1a;添加 border-radius:500px 来让整个图片变成圆形。.img-thumbnail&#xff1a;添加一些内边…

Bootstrap中的条纹进度条使用案例

创建一个条纹的进度条的步骤如下&#xff1a;1.添加一个带有 class .progress 和 .progress-striped 的 <div>2.接着在上面的 <div> 内&#xff0c;添加一个带有 class .progress-bar 和 class progress-bar-* 的空的 <div>。其中&#xff0c;* 可以是succes…

LM拟合算法

一、 Levenberg-Marquardt算法 &#xff08;1&#xff09;ya*e.^(-b*x)形式拟合 clear all % 计算函数f的雅克比矩阵&#xff0c;是解析式 syms a b y x real; fa*exp(-b*x); Jsymjacobian(f,[a b]); % 拟合用数据。参见《数学试验》&#xff0c;p190&#xff0c;例2 % data_1…

java的前生今世_HBaseGC的前生今世-身世篇

网易视频云是网易倾力打造的一款基于云计算的分布式多媒体处理集群和专业音视频技术&#xff0c;提供稳定流畅、低时延、高并发的视频直播、录制、存储、转码及点播等音视频的PAAS服务&#xff0c;在线教育、远程医疗、娱乐秀网易视频云是网易倾力打造的一款基于云计算的分布式…

CapeDwarf – Java EE上的Google App Engine

我有很多爱好。 从早期的Java EE规范一路走来&#xff0c;并通过Java EE 7进行了“云”之旅&#xff0c;我很好奇看到新宣布的CapeDwarf项目有哪些库存&#xff0c;可以在内部引入Google的平台即服务&#xff0c;提供“ Google App Engine ” 。 到目前为止的故事 我确实使用了…

第二周读书笔记——《构建之法》

【对一些实例的看法】 “我写了二叉树的遍历算法实现&#xff0c;在这里&#xff0c;二叉树是数据结构&#xff0c;遍历的实现细节是算法。C程序就是结果。但是这个程序有什么实际用处呢&#xff1f;在Java和其他一些语言中&#xff0c;似乎没有指针&#xff0c;那我可以不必了…

java springmvc 数据库事务_事务的简单回顾_JavaEE框架(Maven+SpringMvc+Spring+MyBatis)全程实战教程_Java视频-51CTO学院...

SpringMVCSpring MVC属于SpringFrameWork的后续产品&#xff0c;已经融合在Spring Web Flow里面。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色&#xff0c;这种分离让它们更容易进行定制。SpringSpring是一个开源框架&#xff0c;Spring是于2003 年兴起的…

前端 ---jQuery的补充

15-jQuery补充 jquery内容补充 jquery除了咱们上面讲解的常用知识点之外&#xff0c;还有jquery 插件、jqueryUI知识点 jqueryUI 官网&#xff1a; https://jqueryui.com/ jqueryUI 中文网&#xff1a; http://www.jqueryui.org.cn/ jquery插件内容包含 官网demo&#xff1a; h…

用Java编写Hadoop MapReduce任务

尽管Hadoop框架本身是使用Java创建的&#xff0c;但MapReduce作业可以用许多不同的语言编写。 在本文中&#xff0c;我将展示如何像其他Java项目一样&#xff0c;基于Maven项目在Java中创建MapReduce作业。 准备示例输入 让我们从一个虚构的商业案例开始。 在这种情况下&#…

Spring集成:轻量级集成方法

当今的应用程序希望能够访问企业环境中的所有业务&#xff0c;而无需考虑与绝望的系统无缝集成的应用程序技术。 可以通过使用中间件技术对各种系统进行布线来实现这种集成。 集成平台使应用程序可以相互共享信息的环境&#xff0c;从而使体系结构具有高度的互操作性。 Spring…

接口IDisposable的用法

C#的每一个类型都代表一种资源&#xff0c;而资源又分为两类&#xff1a; 托管资源 由CLR管理分配和释放的资源&#xff0c;即从CLR里new出来的对象。非托管资源 不受CLR管理的对象&#xff0c;如Windows内核对象&#xff0c;或者文件、数据库连接、套接字、COM对象等。如果类…

图形处理:betweeness中心性– neo4j的密码与graphstream

上周&#xff0c; 我写了关于中间性中心性算法以及使用graphstream 理解它的尝试 &#xff0c;在阅读源代码时&#xff0c;我意识到我可以使用neo4j的所有最短路径算法将某些东西放在一起。 概括地说&#xff0c;中间性中心度算法用于确定图中节点的负载和重要性。 在与Jen讨…

小程序之Tab切换

小程序越来越火了&#xff0c;作为一名&#xff0c;额 有理想的攻城狮&#xff0c;当然要紧跟互联网时代的步伐啦&#xff0c;于是我赶紧抽时间学习了一下小程序的开发&#xff0c;顺便把经验分享给大家。 对于申请账号以及安装开发工具等&#xff0c;大家可以看官网&#xff…

6759: 异或序列

6759: 异或序列 时间限制: 1 Sec 内存限制: 128 MB题目描述 已知一个长度为n的整数数列a1,a2,…,an&#xff0c;给定查询参数l、r&#xff0c;问在al,al1,…,ar区间内&#xff0c;有多少子序列满足异或和等于k。也就是说&#xff0c;对于所有的x,y(l≤x≤y≤r)&#xff0c;满足…

java随机数排序算法_理解快速排序算法

快速排序在平均状况下&#xff0c;排序n个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n^2)次比较&#xff0c;但这种状况并不常见。事实上&#xff0c;快速排序通常明显比 其他Ο(n log n)算法更快&#xff0c;因为它的内部循环(inner loop)可以在大部分的架构上很有效率地…

开课吧视频内容汇总

1. 前端读取文件内容&#xff0c; FileReader对象 2. 用户联网状态 3. application/x-www-form-urlencoded 参数序列化 &#xff08;具体借鉴jquery的$.param方法&#xff09;&#xff0c;后端接收到的数据格式是 a[0][a] 1,并不会将其整理成对象或者数组 var nextStr ;funct…

Servlet和JSP中的文件上传示例

使用Servlet和JSP将文件上传到服务器是Java Web应用程序中的常见任务。 在对Servlet或JSP进行编码以处理文件上传请求之前&#xff0c;您需要了解一点有关HTML和HTTP协议中文件上传支持的知识。 如果要让用户从文件系统中选择文件并上传到服务器&#xff0c;则需要使用<inpu…