在上一教程中,我展示了如何使用注释来验证表单 。 这对于简单的验证非常有用,但是最终,您需要验证一些现成的注释中没有的自定义规则。 例如,如果您需要根据输入的出生日期来验证用户已超过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应用程序,我们的两个验证就位并可以使用!

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

全文: 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

Spring MVC自定义验证注释相关推荐

  1. Spring MVC 自定义验证器示例

    在任何 spring web mvc 应用程序中,我们经常必须处理表单.应用程序首先显示一个表单,然后用户填写该表单并将其提交给服务器.在服务器上,应用程序需要捕获表单输入并处理输入(例如,存储在数据 ...

  2. Spring MVC –自定义RequestMappingHandlerMapping

    在xml bean定义文件中使用<mvc:annotation-driven />配置Spring MVC时,在内部将一个名为RequestMappingHandlerMapping的组件 ...

  3. spring mvc前端验证代码生成器

    spring mvc只提供了服务端验证功能,客户端验证需要自己编写,这是一项重复枯燥的工作,所以考虑基于验证注解自动生成客户端验证代码 一.自定义EL函数 /*** 自定义EL函数调用* * @aut ...

  4. Spring MVC数据验证

    文章目录 客户端验证 服务器端验证 自定义 Spring 验证器 Validator接口 ValidationUtils 类 Spring MVC验证器应用实例 JSR 303 验证 Hibernat ...

  5. Spring中自定义JSON注释

    工具类代码下载地址:链接:http://pan.baidu.com/s/1qYNQOGW 密码:e18w 1.如图1的系统注释,有的时候我们在开发的时候系统的注释并不够用,此时我们可以自己写一些注释来 ...

  6. Spring MVC Hibernate验证器使用示例

    下面的示例演示如何使用Spring Web MVC框架在表单中使用错误处理和验证器. 首先使用Eclipse IDE,并按照以下步骤使用Spring Web Framework开发基于动态表单的Web ...

  7. [Spring MVC] - InitBinder验证

    Spring MVC使用InitBinder验证: 使用InitBinder做验证的情况一般会在此Controller中提交的数据需要有一些是业务性质的,也即比较复杂的验证情况下才会使用.大部份简单的 ...

  8. 使用Spring Boot和Spring MVC自定义HttpMessageConverters

    为Spring Boot应用程序或直接的Spring MVC应用程序公开基于REST的终结点很简单,以下是一个控制器,该终结点公开了一个终结点,用于基于其发布的内容创建实体: @RestControl ...

  9. Spring MVC JSR-303验证框架之Hibernate-Validator

    对于 JSR 303 验证,目前有两个实现,一个是 Hibernate Validator,一个是 Apache BVal.本教程采用的是 Hibernate Validator,注意它和 Hiber ...

最新文章

  1. 服务运行一段时间,redis缓存就不可用,原来是这个锅!
  2. nyoj--203--三国志(迪杰斯特拉+背包)
  3. 11)PHP,单选框和复选框的post提交方式处理
  4. java生成随机数的两种方式
  5. thinkphp3.2.3版本的数据库增删改查实例
  6. Laravel Collection 常用方法(1)
  7. 使用Telnet命令收发E-mail
  8. adas硬件_ADAS系统功能安全设计/SOTIF需求和测试实例/软件安全架构/硬件安全设计......
  9. [转载] python中断响应_用Python脚本监测.py脚本的进程状态,并实现中断重启。
  10. 修改服务器控件的ID和Name
  11. WPS中的公式编辑器如何打空格
  12. 动态考勤表-日期只能在某个月选时间段
  13. kalibr fov畸变模型
  14. 思科Nexus 9000系列交换机光模块解决方案
  15. 关于一道你们眼中的水题 Windy数 的乱写(数位dp)
  16. 1.0django入门01
  17. fastadmin 获取表格选中列的id和值
  18. TP4333TPOWER应急灯同步充放移动电源IC解决方案
  19. Visual Studio 2010 下载地址 V10各种版本官方下载网址
  20. 毕业论文查重率太高怎么办 2个方法让你轻松降重

热门文章

  1. mysql事务基础+基于innodb的行锁+间隙锁+如何锁定行
  2. gradle 构建 Smack 报错:Can't find android.jar for 8 API. + steps for building android platform
  3. hibernate 标识符_Hibernate中的标识符
  4. cuba开发_使用CUBA进行开发–与Spring相比有很大的转变?
  5. sts集成jboss_与JBoss BPM Travel Agency更新了Modern BPM数据集成
  6. 大屏可视化分配率是什么意思_什么是分配率?
  7. jboss项目导入idea_JBoss BPM Suite快速指南–将外部数据模型导入BPM项目
  8. Mockito匹配器优先
  9. visualvm远程jvm_如何使用VisualVM监视服务器上的多个JVM
  10. 用置换破坏您的JUnit5测试