基于Hibernate Validator参数校验


hibernate Validator 是 Bean Validation 的参考实现 。

Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint。

在日常开发中,Hibernate Validator经常用来验证bean的字段,基于注解,方便快捷高效。

1. Bean Validation 中内置的 constraint

注解作用

@Valid被注释的元素是一个对象,需要检查此对象的所有字段值

@Null被注释的元素必须为 null

@NotNull被注释的元素必须不为 null

@AssertTrue被注释的元素必须为 true

@AssertFalse被注释的元素必须为 false

@Min(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值

@Max(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值

@DecimalMin(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值

@DecimalMax(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值

@Size(max, min)被注释的元素的大小必须在指定的范围内

@Digits (integer, fraction)被注释的元素必须是一个数字,其值必须在可接受的范围内

@Past被注释的元素必须是一个过去的日期

@Future被注释的元素必须是一个将来的日期

@Pattern(value)被注释的元素必须符合指定的正则表达式

2. Hibernate Validator 附加的 constraint

注解作用

@Email被注释的元素必须是电子邮箱地址

@Length(min=, max=)被注释的字符串的大小必须在指定的范围内

@NotEmpty被注释的字符串的必须非空

@Range(min=, max=)被注释的元素必须在合适的范围内

@NotBlank被注释的字符串的必须非空

@URL(protocol=,host=,port=,regexp=,flags=)被注释的字符串必须是一个有效的url

@CreditCardNumber被注释的字符串必须通过Luhn校验算法,银行卡,信用卡等号码一般都用Luhn计算合法性

@ScriptAssert(lang=, script=, alias=)要有Java Scripting API 即JSR 223(“Scripting for the JavaTM Platform”)的实现

@SafeHtml(whitelistType=,additionalTags=)classpath中要有jsoup包

Hibernate Validator使用方式

第一步,引入下面两个jar

hibernate-validator-4.1.0.Final.jar

validation-api-1.0.0.GA.jar

第二步,实体类加上注解

public class SmsDto extends BaseDto{

@Length(min = 2,message = "参数有误")

@NotBlank(message = "短信参数不允许为空")

private String params;//短信模板参数,json结构

@Min(value = 1L,message = "模板id有误")

@Max(value = Long.MAX_VALUE,message = "模板id有误")

@NotNull(message = "模板id不允许为空")

private Long templateId;//模板id

@Length(min = 11,max=560,message = "手机号长度必须是11~560")

@NotNull(message = "手机号不允许为空")

private String phones;//手机号,多个逗号隔开

@NotBlank(message = "创建人不能为空,如果是系统发送,请传入system")

private String createBy;//创建人

@NotBlank(message = "ip不能为空,如果是系统发送,请传入localhost")

private String ip;//用户的ip地址

//getter setter method...

}

第三步,使用如下方式进行校验

//校验参数

ValidationResult validationResult = ValidatorKit.validateEntity(smsDto);

if(validationResult.hasErrors()){

return Result.fail(validationResult.getFirstErrorMsg());

}

相关工具类

import java.util.Map;

/**

* 校验结果

*/

public class ValidationResult {

//校验结果是否有错

private boolean hasErrors;

//第一条错误信息

private String firstErrorMsg;

//校验错误信息

private Map errorMsg;

//getter setter method...

}

import org.apache.commons.collections.CollectionUtils;

import javax.validation.ConstraintViolation;

import javax.validation.Validation;

import javax.validation.Validator;

import javax.validation.groups.Default;

import java.util.HashMap;

import java.util.Map;

import java.util.Set;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

/**

* 验证工具

*/

public class ValidatorKit {

private static Validator validator = Validation.buildDefaultValidatorFactory().getValidator();

/**

* 验证某个实体类

*/

public static ValidationResult validateEntity(T obj) {

ValidationResult result = new ValidationResult();

Set> set = validator.validate(obj, Default.class);

if (CollectionUtils.isNotEmpty(set)) {

result.setHasErrors(true);

Map errorMsg = new HashMap<>();

String firstErrorMsg = null;

for (ConstraintViolation cv : set) {

if (firstErrorMsg == null) {

firstErrorMsg = cv.getMessage();

}

errorMsg.put(cv.getPropertyPath().toString(), cv.getMessage());

}

result.setFirstErrorMsg(firstErrorMsg);

result.setErrorMsg(errorMsg);

}

return result;

}

/**

* 验证某个实体的某个属性

*/

public static ValidationResult validateProperty(T obj, String propertyName) {

ValidationResult result = new ValidationResult();

Set> set = validator.validateProperty(obj, propertyName, Default.class);

if (CollectionUtils.isNotEmpty(set)) {

result.setHasErrors(true);

Map errorMsg = new HashMap<>();

String firstErrorMsg = null;

for (ConstraintViolation cv : set) {

if (firstErrorMsg == null) {

firstErrorMsg = cv.getMessage();

}

errorMsg.put(propertyName, cv.getMessage());

}

result.setFirstErrorMsg(firstErrorMsg);

result.setErrorMsg(errorMsg);

}

return result;

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,599评论 18 139
  • //Clojure入门教程: Clojure – Functional Programming for the J...
    葡萄喃喃呓语阅读 3,616评论 0 7
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,581评论 18 399
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,718评论 2 17
  • o(︶︿︶)o 到底是空气质量太差还是吃了芒果,早上起来脸上就出现了过敏迹象,吃了药一天都不见好转。。。痛苦。 今...
    LittleBoyCelery阅读 151评论 0 0