如何自定义JSR-303标准的validator
在web应用中为了保证数据的有效性而对用户提交的表单数据是必需的,而前台客户端的验证例如javascript并不总是那么安全和可靠,这样我们就需要一个健壮的后台验证框架来处理这个问题。好在java发布了JSR-303接口标准,而实现这一标准的有很多供应商,Hibernate Validator验证框架是使用得比较多的。
今天在处理用户提交的身份证号码这个表单域遇到了一个问题,大家知道我们的身份证号码早期版本只有15位,而二代身份证号码都是18位,Hibernate Validator的@Size注解只能处理最少多少位至最多多少位,却不能处理15位或18位这种情况,于是乎,我就想到了需要使用自定义注解validator来解决这个问题。
首先我们需要定义一个Annotation:
@Documented
@Constraint(validatedBy = { IDConstraintValidator.class })
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface IDValidator { String message() default "{id}"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
然后定义一个类用来处理具体的验证逻辑:
public class IDConstraintValidator implements ConstraintValidator<IDValidator, String> {
@Override
public void initialize(IDValidator idValidator) {
}
@Override
public boolean isValid(String id, ConstraintValidatorContext ctx) {
int length = id.length();
if (isNumeric(id) && (length == 15 || length == 18)) {
return true;
}
return false;
}
}
最后在pojo类上面应用我的注解:
public abstract class Person implements Serializable {
private static final long serialVersionUID = 1L;
@IDValidator(message="{person.id.invalid}")
private String id;
private String firstName;
private String lastName;
private String gender;
private int age;
public String getId() {
return id;
}
我把错误信息放在资源文件里面,省去页面测试描述,但是我把Controller里面打印的错误信息展示出来了:
aaarticlea/png;base64,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" alt="" />
如何自定义JSR-303标准的validator的更多相关文章
- JSR 303标准
JSR 303是Java为bean数据合法性校验提供的标准框架,JSR 303通过在Bean属性上标注类似于@NotNull.@Max等标准的注解指定校验规则,并通过标准的校验接口对bean进行验证. ...
- SpringMVC中的 JSR 303 数据校验框架说明
JSR 303 是java为Bean数据合法性校验提供的标准框架,它已经包含在JavaEE 6.0中. JSR 303 通过在Bean属性上标注类似于@NotNull.@Max等标准的注解指定校验规则 ...
- JSR 303 进行后台数据校验
一.JSR 303 1.什么是 JSR 303? JSR 是 Java Specification Requests 的缩写,即 Java 规范提案. 存在各种各样的 JSR,简单的理解为 JSR 是 ...
- Springboot 使用 JSR 303 对 Controller 控制层校验及 Service 服务层 AOP 校验,使用消息资源文件对消息国际化
导包和配置 导入 JSR 303 的包.hibernate valid 的包 <dependency> <groupId>org.hibernate.validator< ...
- JSR教程1——JSR 303 - Bean Validation介绍
1.Bean Validation 在任何时候,当你要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情.应用程序必须通过某种手段来确保输入进来的数据从语义上来讲是正确的.在通常的情况下, ...
- JSR 303 - Bean Validation 介绍及最佳实践
JSR 303 - Bean Validation 介绍及最佳实践 JSR 303 – Bean Validation 是一个数据验证的规范,2009 年 11 月确定最终方案.2009 年 12 月 ...
- JSR 303 - Bean Validation 介绍及最佳实践(转)
JSR 303 – Bean Validation 是一个数据验证的规范,2009 年 11 月确定最终方案.2009 年 12 月 Java EE 6 发布,Bean Validation 作为一个 ...
- JSR 303 - Bean Validation 模型验证
类是转载的,不知道转的哪里的. 此类依赖 JSR 303 – Bean Validation, Hibernate Validator. 代码不能直接运行.意会一下.自己改改. import com. ...
- JSR 303 - Bean Validation 简单介绍及用法
一.JSR-303简单介绍 JSR-303 是 JAVA EE 6 中的一项子规范.叫做 Bean Validation,官方參考实现是Hibernate Validator. 此实现与 Hibern ...
- SpringMVC中实现Bean Validation(JSR 303 JSR 349 JSR 380)
JSR 303是针对bean数据校验提出的一个规范.使用注解方式实现数据校验. 每个注解的用法这里就不多介绍,请移步JSR 303 - Bean Validation 介绍及最佳实践 笔者上面提到的J ...
随机推荐
- nyoj 79 拦截导弹 (动态规划)
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=79 题意即求最长单调递减子序列 #include<iostream> #inc ...
- U3D音频系统
一.基本信息 1.支持的声音格式 WAV OGG MP3 AIFF MOD S3M xm IT 导入以后,unity会选择的压缩方式: WAV:无损,音质好,文件大,适用于较短文件 OGG.MP ...
- php 常量定义
php常量定义及取值 常量在定义时赋值: 不能变 :不能销毁: 具有超全局作用于:常量只能储存标量数据(字符 整型 浮点 ): <?php define("hello", ...
- 数据库索引的实现原理(笔记)详细http://www.linezing.com/blog/?p=798#nav-1
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询.更新数据库表中数据.索引的实现通常使用B树及其变种B+树. 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某 ...
- cos距离与欧式距离
1. 欧氏距离(EuclideanDistance) 欧氏距离是最易于理解的一种距离计算方法,源自欧氏空间中两点间的距离公式. (1)二维平面上两点a(x1,y1)与b(x2,y2)间的欧氏距离: ( ...
- VR应用向导,全球Top10 VR应用排行榜
2016年国际知名产商索尼.三星.HTC.Oculus.YouTube等等都推出了自己的VR设备,与此同时还有自有的VR应用平台,供各位玩家下载应用体验沉浸式VR,当然每个平台的VR应用下载量各不相同 ...
- 前端tab页实例
<div class="tabbable"> <ul class="nav nav-tabs padding-16"> <c:fo ...
- Conversion to Dalvik format failed with error 1(android)
1.如果不修改android sdk版本,则使用project clean 命令作用于某工程即可. (该处理方式只是在高版本中兼容了低版本工程,未真正意义上的升级) 2.如果修改android sdk ...
- nodejs 实现简单的文件上传功能
首先需要大家看一下目录结构,然后开始一点开始我们的小demo. 文件上传总计分为三种方式: 1.通过flash,activeX等第三方插件实现文件上传功能. 2.通过html的form标签实现文件上传 ...
- 7、Objective-C中的各种遍历(迭代)方式
一.使用for循环 要遍历字典.数组或者是集合,for循环是最简单也用的比较多的方法,示例如下: //普通的for循环遍历 -(void)iteratorWithFor { //////////处理数 ...