在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. [SOJ]Easy sort (归并排序)

    Description You know sorting is very important. And this easy problem is: Given you an array with N ...

  2. dirty cow exp

    公司搞底层的改了一下,说做到了几个不死机 /* * (un)comment correct payload first (x86 or x64)! * * $ gcc cowroot.c -o cow ...

  3. Reprint: Serialization

    Having just recently ran into some major serialization issues I’m going to list some of the errors a ...

  4. iScroll 下 a 标签失效

    遇到个莫名其妙的问题,iScroll 下的 a 标签点击没有反应了,不管怎么调整 z-index 都无效果,很是无语. 查找半天后找到解决方法: $(function(){ new IScroll(' ...

  5. 图片上传插件用法,net语法【二】

    之前一直写过KindeEditor中的小控件作为单独上次,但业务要求需要另一种方式 现在改用ajaxfileupload.js试试,这个一百度 一.首页引用 <script src=" ...

  6. Unity性能优化——LOD技术

    LOD,中文名多层次细节,是游戏中最常用的技术,它按照模型的位置和重要程度决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算.今天我们来实现使用它来做一个简单的优化例子. ...

  7. Redis 集群解决方案比较

    调研比较了三个Redis集群的解决方案: 系统 贡献者 是否官方Redis实现 编程语言 Twemproxy Twitter 是 C Redis Cluster Redis官方 是 C Codis 豌 ...

  8. 各种编码之间的关系以及getBytes的使用

    编码基础知识参考http://my.oschina.net/chape/blog/201725 我对此作了简单的概括 iso8859-1 (通常叫做Latin-1) 属于单字节编码,最多能表示的字符范 ...

  9. <密码的实现>输入密码的时候,显示“*”,而不是显示输入内容

    一开始还以为用C语言和C++不能实现输入密码的时候显示出“*”而不显示输入的内容呢!没想到偶然的机会试出了用while循环结构可以实现.以下是我整理的C语言和C++的代码,供初学者参考. 这是C语言实 ...

  10. 【实验室笔记】C#的Socket客户端接收和发送数据

    采用socket发送和接收数据的实验中,服务器采用的是网络助手作为模拟服务器端. 客户端程序流程: 应用的命名空间: using System.Net; using System.Net.Socket ...