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

}

}

你可能感兴趣的:(基于Hibernate Validator参数校验)