在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的更多相关文章

  1. JSR 303标准

    JSR 303是Java为bean数据合法性校验提供的标准框架,JSR 303通过在Bean属性上标注类似于@NotNull.@Max等标准的注解指定校验规则,并通过标准的校验接口对bean进行验证. ...

  2. SpringMVC中的 JSR 303 数据校验框架说明

    JSR 303 是java为Bean数据合法性校验提供的标准框架,它已经包含在JavaEE 6.0中. JSR 303 通过在Bean属性上标注类似于@NotNull.@Max等标准的注解指定校验规则 ...

  3. JSR 303 进行后台数据校验

    一.JSR 303 1.什么是 JSR 303? JSR 是 Java Specification Requests 的缩写,即 Java 规范提案. 存在各种各样的 JSR,简单的理解为 JSR 是 ...

  4. Springboot 使用 JSR 303 对 Controller 控制层校验及 Service 服务层 AOP 校验,使用消息资源文件对消息国际化

    导包和配置 导入 JSR 303 的包.hibernate valid 的包 <dependency> <groupId>org.hibernate.validator< ...

  5. JSR教程1——JSR 303 - Bean Validation介绍

    1.Bean Validation 在任何时候,当你要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情.应用程序必须通过某种手段来确保输入进来的数据从语义上来讲是正确的.在通常的情况下, ...

  6. JSR 303 - Bean Validation 介绍及最佳实践

    JSR 303 - Bean Validation 介绍及最佳实践 JSR 303 – Bean Validation 是一个数据验证的规范,2009 年 11 月确定最终方案.2009 年 12 月 ...

  7. JSR 303 - Bean Validation 介绍及最佳实践(转)

    JSR 303 – Bean Validation 是一个数据验证的规范,2009 年 11 月确定最终方案.2009 年 12 月 Java EE 6 发布,Bean Validation 作为一个 ...

  8. JSR 303 - Bean Validation 模型验证

    类是转载的,不知道转的哪里的. 此类依赖 JSR 303 – Bean Validation, Hibernate Validator. 代码不能直接运行.意会一下.自己改改. import com. ...

  9. JSR 303 - Bean Validation 简单介绍及用法

    一.JSR-303简单介绍 JSR-303 是 JAVA EE 6 中的一项子规范.叫做 Bean Validation,官方參考实现是Hibernate Validator. 此实现与 Hibern ...

  10. SpringMVC中实现Bean Validation(JSR 303 JSR 349 JSR 380)

    JSR 303是针对bean数据校验提出的一个规范.使用注解方式实现数据校验. 每个注解的用法这里就不多介绍,请移步JSR 303 - Bean Validation 介绍及最佳实践 笔者上面提到的J ...

随机推荐

  1. OpenCV备忘

    都是转来的内容的,算是整理一下 OpenCV备忘 深度和通道的理解 CV_8UC1 是指一个8位无符号整型单通道矩阵, CV_32FC2是指一个32位浮点型双通道矩阵 CV_8UC1 CV_8SC1 ...

  2. 【C#】面试题整理

    1.C#中类是否支持多继承?请说明原因.答:不支持,需要用接口来实现多继承 2.我们都知道一个类可以有多个构造函数,并且C#会在我们创建类的时候默认的提供一个无参的构造函数,当我实现了另外一个有参数的 ...

  3. USB硬盘 raw之后,DiskGenius 恢复

    最近,为了在E560上安装LINUX(先是gentoo,后是rhel7,最后是 centos7),用UltralISO 把一块移动硬盘给写成RAW格式了.现在又想把移动硬盘给恢复回去.采用一些方法,效 ...

  4. "malloc: * error for object 0x17415d0c0: Invalid pointer dequeued from free list * set a breakpoint in malloc_error_break to debug";

    I've fixed this error with Xcode 8 on iOS 8.3. I've just changed Deployment Target from 8.3 to 8.0. ...

  5. hibernate、easyui、struts2整合

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. PHPStorm 安装 SASS、SCSS + Compass

    许久没更新博客啦,这两天研究了下 SASS 和 LESS ,最终选了 SASS,因为相对比较成熟些吧,试了很多坑之后,终于成功了,下面上步骤: 1. 安装 PHPStorm 的 SASS 插件 好像是 ...

  7. glusterfs快速安装

    因为公司ES02集群使用的是SSD磁盘做的raid0,为了保证存放文件的可靠性,即在ES02集群上部署了一套分布式文件系统glusterfs.   结构 ES11    含有gfs程序,并挂载gfs在 ...

  8. C# 实现客户端程序自动更新

    看到一篇不错的帖子,可能以后会用到,果断收藏 文章来源 博客园jenry(云飞扬)http://www.cnblogs.com/jenry/archive/2006/08/15/477302.html ...

  9. Flash cc 添加目标Flash Player

    原文出处:http://zengrong.net/post/1568.htm 第一步 首先下载最新的 playerglobal.swc(基于Flash Player11): http://www.ad ...

  10. centos7 crontab笔记

    1.crontab相关命令 语法:crontab [-u <用户名称>][配置文件] 或 crontab [-u <用户名称>][-elr] 参数: -e 编辑该用户的计时器设 ...