博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何自定义JSR-303标准的validator
阅读量:4619 次
发布时间:2019-06-09

本文共 1639 字,大约阅读时间需要 5 分钟。

在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
[] payload() default {};}

 然后定义一个类用来处理具体的验证逻辑:

1 public class IDConstraintValidator implements ConstraintValidator
{ 2 3 @Override 4 public void initialize(IDValidator idValidator) { 5 6 } 7 8 @Override 9 public boolean isValid(String id, ConstraintValidatorContext ctx) {10 int length = id.length();11 if (isNumeric(id) && (length == 15 || length == 18)) {12 return true;13 }14 return false;15 }16 }

最后在pojo类上面应用我的注解:

1 public abstract class Person implements Serializable { 2      3     private static final long serialVersionUID = 1L; 4      5     @IDValidator(message="{person.id.invalid}") 6     private String id; 7      8     private String firstName; 9     10     private String lastName;11     12     private String gender;13     14     private int age;15     16     public String getId() {17         return id;18     }

我把错误信息放在资源文件里面,省去页面测试描述,但是我把Controller里面打印的错误信息展示出来了:

转载于:https://www.cnblogs.com/stonefeng/p/5656421.html

你可能感兴趣的文章
[LevelDB] LevelDB理论基础
查看>>
【codecombat】 试玩全攻略 第一关kithguard地牢
查看>>
【DP】 POJ 1191 棋盘分割 记忆化搜索
查看>>
自动化测试 Appium之Python运行环境搭建 Part2
查看>>
说说DBA职责和目标
查看>>
从头认识Spring-2.4 基于java的标准注解装配-@Inject-限定器@Named
查看>>
sql server 实现多表连接查询
查看>>
Python标准库:内置函数getattr(object, name[, default])
查看>>
转:android 自定义RadioButton样式
查看>>
HTTP请求过程
查看>>
织梦多域名解析到同一个空间导致打开链接不一致怎么办?
查看>>
Xcode10 library not found for -lstdc++ 找不到问题
查看>>
Mysql 8.0.13如何重置密码
查看>>
发布功能完成
查看>>
excel 合并单元格
查看>>
iOS设计模式简介
查看>>
c# 扩展方法 奇思妙用 高级篇 九:OrderBy(string propertyName, bool desc)
查看>>
C语言中的地址传递(传指针,传递给形参的指针仍然是实参指针的一份拷贝)
查看>>
redis缓存数据库及Python操作redis
查看>>
opencms忘记Admin用户登录密码解决方案
查看>>