[译]SpringMVC自定义验证注解(SpringMVC custom validation annotations)
在基于SpringMVC框架的开发中,我们经常要对用户提交的字段进行合法性验证,比如整数类型的字段有个范围约束,我们会用@Range(min=1, max=4)。在实际应用开发中,我们经常碰到一些自己业务的场景要自定义一些验证规则,而这是标准的JSR-303和Hibernate Validation所不具备的,所以我们就要根据JSR-303的规范来扩展我们自定义的验证规则注释.
假设我们现在有个接口要接收一个手机的字段, 它的约束规则是13位数字字符. 我们可以通过正则表达式完成: ^\d{13}$来验证. 下面是个javabean代码:
public class Person{
@Phone
private String phone;
}
我们再来看下@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 {};
}
这个注解类看起来复杂, 其实不然. 因为这基本上每个扩展验证注解都必需定义的三个方法, 是规范定义的, 所以我们可以像个模板一样copy过来改下. 这里要注意的是这个message方法, 定义了如果验证出错时要显示的消息内容. 对于消息格式和规范, 可以使用标准的Spring Message Resource Bindle来, 可以参考这篇. 现在定义了注解, 正如你所料, 我们要定义下具体的业务规则:
public class PhoneConstraintValidator implements ConstraintValidator<Phone, String> {
@Override
public void initialize(Phone phone) { }
@Override
public boolean isValid(String phoneField, ConstraintValidatorContext cxt) {
if(phoneField == null) {
return false;
}
return phoneField.matches("^\d{13}$");
}
}
所有验证规则方法类都要实现ConstraintValidator<V,F>这个接口, 里面第一个方法initialize的参数是所关联的注解对象, 所以这个方法里可以取出使用注解的地方传进来的值, 后面一个例子会讲到这一点. 第二个最核心的方法isValid第一个参数就是我们要验证的字段值, 大家看下上面的代码就知道怎样使用了.
下面我们来看第二种形式的注解. 假如我们对用户的生日字段进行验证, 限制只满足1989年出生的人。 如下:
public class Person {
@Year(1989)
private Date birthday;
// getters setters ...
}
现在自定义验证注解Year有要传入一个参数, 用默认的value方法接收:
@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 {};
}
还是要上面的一样, 要定义一个规则约束描述类:
public class YearConstraintValidator implements ConstraintValidator<Year, Date> {
private int annotationYear;
@Override
public void initialize(Year year) {
this.annotationYear = year.value();
}
@Override
public 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;
}
}
可以看到initiallize方法中可以接收关联的注解Year, 这里可以取出里面的参数信息用于约束规则方法调用.
原文: http://www.javacodegeeks.com/2013/07/spring-mvc-custom-validation-annotations.html
[译]SpringMVC自定义验证注解(SpringMVC custom validation annotations)的更多相关文章
- springboot学习(二十二)_ 使用@Constraint注解自定义验证注解
最近项目在使用如@NotNull @Max 等配合@vaild 注解进行验证传过来的参数校验,然后通过统一异常处理,直接返回给前端,不用在业务代码中对这些参数进行校验.但是官方提供的并不能全部满足项目 ...
- SpringBoot-表单验证-统一异常处理-自定义验证信息源
1. 简介 我们都知道前台的验证只是为了满足界面的友好性.客户体验性等等.但是如果仅靠前端进行数据合法性校验,是远远不够的.因为非法用户可能会直接从客户端获取到请求地址进行非法请求,所以后台的校验是必 ...
- Hibernate validation 注解 springmvc 验证 分组
SpringMVC验证框架Validation特殊用法 1. 分组 有的时候,我们对一个实体类需要有多中验证方式,在不同的情况下使用不同验证方式,比如说对于一个实体类来的id来说,保存的时候是不需 ...
- springMVC自定义注解实现用户行为验证
最近在进行项目开发的时候需要对接口做Session验证 1.自定义一个注解@AuthCheckAnnotation @Documented @Target(ElementType.METHOD) @I ...
- SpringMVC 使用验证框架 Bean Validation(上)
SpringMVC 使用验证框架 Bean Validation(上) 对于任何一个应用而言在客户端做的数据有效性验证都不是安全有效的,这时候就要求我们在开发的时候在服务端也对数据的有效性进行验证. ...
- springmvc 自定义注解
1. 自定义一个注解 @Documented //文档生成时,该注解将被包含在javadoc中,可去掉 @Target(ElementType.METHOD)//目标是方法 @Retention(Re ...
- SpringMVC使用@Valid注解进行数据验证
SpringMVC使用@Valid注解进行数据验证 from:https://blog.csdn.net/zknxx/article/details/52426771 我们在做Form表单提交的时 ...
- asp.net mvc 中的自定义验证(Custom Validation Attribute)
前言
- SpringMVC数据验证
SpringMVC数据验证——第七章 注解式控制器的数据验证.类型转换及格式化——跟着开涛学SpringMVC 资源来自:http://jinnianshilongnian.iteye.com/blo ...
随机推荐
- [SDOI2011]染色 题解
题目大意: 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段) 思路: 树剖之后 ...
- Android Immersive Mode (沉浸模式) 还是 Translucent Bars (透明状态栏)
Immersive Mode (沉浸模式) 还是 Translucent Bars (透明状态栏) [科普]什么叫真正的“沉浸式”状态栏? 为什么在国内会有很多用户把「透明栏」(Translucent ...
- ACM 数独
数独 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 数独是一种运用纸.笔进行演算的逻辑游戏.玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一 ...
- NOIp 2014 #2 联合权值 Label:图论 !!!未AC
题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...
- 【BZOJ2186】【SDoi2008】沙拉公主的困惑 数论
Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁国现 ...
- 纪念逝去的岁月——C/C++排序二叉树
1.代码 2.运行结果 3.分析 1.代码 #include <stdio.h> #include <stdlib.h> typedef struct _Node { int ...
- jQuery常用方法验证
验证邮箱: $('input[data-name="email"]').keyup(function () { var em; em = $(this).val(); if (!e ...
- Rockey 4加密狗介绍
Rockey 4加密狗介绍 特点:该加密狗是单片机加密狗时代飞天公司的主力产品,R4一样继承了R2的硬件特征,具有全球唯一性硬件ID.R4内置了硬件随机数生成器,可以进行一些抗跟踪,或在硬件算法中参与 ...
- 制作、解析带logo的二维码
用DecoderQRCode来解析带logo的二维码,发现报错,解析不了,于是便又查资料,找到了更强大的制作二维码 工具:GooleZXing 首先下GooleZXing的jar包. -------- ...
- Eqs
Eqs 题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=15029 题意: 给出系数a1,a2,a3,a4,a5,求出 ...