在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. Python基础知识学习_Day5

    一.生成器和迭代器 1.列表生成 >>> a [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> a = map(lambda x:x+1, a ...

  2. android 界面布局

    一.LinearLayout LinearLayout 又称作线性布局,是一种非常常用的布局,它所包含的控件在线性方向上依次排列. android:orientation="horizont ...

  3. MQTT协议之 Apache Apollo服务

    一.说明 MQTT是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分.该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和致动器(比如通过Twitter让房屋联网) ...

  4. 对xlslib库与libxls库的简易封装

    一.简介 xlslib库是用来创建excel文件.libxls是用来读取excel文件的,在使用C++或者QT语言来设计对excel文件的读取.都需要事先下载这两个库编译成功后再进行程序设计的.之所以 ...

  5. java静态方法之线程安全问题

    静态方法和实例方法的区别是静态方法只能引用静态变量,静态方法通过类名来调用,实例方法通过对象实例来调用 每个线程都有自己的线程栈,栈与线程同时创建,每一个虚拟机线程都有自己的程序计数器PC,在任何时刻 ...

  6. jquery 获取当前对象的id取巧验证的一种方法

    <!doctype html><html><head><meta charset="utf-8"><title>titl ...

  7. Another Array of Orz Pandas

    Another Array of Orz Pandas 题目链接:http://acm.xidian.edu.cn/problem.php?id=1187 线段树 线段树维护区间和以及区间内各个数平方 ...

  8. Python Data Visualization Cookbook 2.9.2

    import numpy as np import matplotlib.pyplot as plt def is_outlier(points, threshold=3.5): if len(poi ...

  9. 《Javascript权威指南》

    <Javascript权威指南> chorme.safari中的input或textarea html超链接(a)详细讲解 html5新增及删除标签 html表格 图片加alt属性

  10. 字符串---分割成数组(str_split ),算出一个字符串中出现最多的字符, 学校中最多的姓名

    split 分割separate分开 little 小的 echo '<meta http-equiv="Content-type" content="text/h ...