如何自定义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 ...
随机推荐
- http缓存协议详解
Cache-control策略(重点关注):Cache-Control与Expires的作用一致,都是指明当前资源的有效期,控制浏览器是否直接从浏览器缓存取数据还是重新发请求到服务器取数据 no-ca ...
- [读书笔记]python3.5实现socket通讯(TCP)
TCP连接: tcp是面向连接的一个协议,意味着,客户端和服务器开发发送数据之前,需要先握手创建一个TCP连接.TCP连接的一端与客户端套接字相互联系,另一端与服务器套接字相联系.当创建该TCP连接的 ...
- WindowsServer2012 R2 64位中文标准版(IIS8.5)下手动搭建PHP环境详细图文教程(二)安装IIS8.5
//来源:http://www.imaoye.com/Technology/WindowsServer2012R264IIS85.html 阿里云服务器ECS Windows Server 2012 ...
- 图片添加border 不占用图片的大小
因为设计稿中的分割线大多分为两种情况:1.在图片右侧:2.在图片右侧+下方. 那么使用伪类before和after以及绝对定位很容易在不改变原布局的情况使图片按照设计稿输出和保留分割线. 例div.i ...
- HDU 4403 A very hard Aoshu problem
暴力$dfs$. 先看数据范围,字符串最长只有$15$,也就是说枚举每个字符后面是否放置“$+$”号的复杂度为${2^{15}}$. 每次枚举到一种情况,看哪些位置能放“$=$”号,每个位置都试一下, ...
- line-height属性详解
line-height属性详解:http://www.cnblogs.com/dolphinX/p/3236686.html
- 改造vim
1.安装Vim和Vim基本插件首先安装好Vim和Vim的基本插件.这些使用apt-get安装即可: lingd@ubuntu:~/arm$sudo apt-get install vim vim-sc ...
- 洛谷-拼数-NOIP1998提高组复赛
题目描述 Description 设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数. 例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213 又如:n=4 ...
- 页面导入样式时,使用link和@import有什么区别?
1 link属于XHTML标签,而@import是CSS提供的: 2 页面被加载的时,link会同时被加载,而@import引用的CSS会等到页面被加载完再加载: 3 import只有在IE5以上才能 ...
- JavaFx的一些总结
JavaFX的一些总结:1.场景scene.布局layout.控件control是javaFX的基本组成部分.控件可以放到布局中,布局可以放到布局中,也可以放到场景中,这里要注意,场景里只能放一个布 ...