基于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;

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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