很多时候都需要校验穿的参数是否符合规则,但是这种校验的代码会重复很多,所以引入 validator 来校验参数,这样可以省去很多冗余的代码
目录
pom文件引入
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.4.Final</version>
</dependency>
<!-- 工具类 就是封装平常用的方法 -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
<!-- 断言神器 -->
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
</dependency>
需要校验的参数
@Getter
@Setter
public class UserParam {
private Integer id;
@NotBlank(message = "用户名不可以为空")
@Length(min = 1, max = 20, message = "用户名长度需要在20个字以内")
private String username;
@NotBlank(message = "电话不可以为空")
@Length(min = 1, max = 13, message = "电话长度需要在13个字以内")
private String telephone;
@NotBlank(message = "custEmail不可为空")
@Length(max = 50, message = "custEmail不超过{max}个字符")
@Email(message = "{valid.mail}")
private String mail;
// 销售日期(格式:yyyy-MM-dd)
@Length(max = 20, message = "autoBoughtTime不超过{max}个字符")
@Pattern(regexp = "^\\d{4}-\\d{2}-\\d{2}$", message = "autoBoughtTime格式必须为yyyy-MM-dd")
private String autoBoughtTime;
}
编写 Validator 校验工具
public class BeanValidator {
private static ValidatorFactory validatorFactory= Validation.buildDefaultValidatorFactory();
//返回map
public static <T> Map<String,String> validate(T t, Class... groups){
Validator validator=validatorFactory.getValidator();
Set validateResult=validator.validate(t,groups);
//如果为空
if (validateResult.isEmpty()){
return Collections.emptyMap();
}else{
//不为空时表示有错误
LinkedHashMap errors= Maps.newLinkedHashMap();
//遍历
Iterator iterator=validateResult.iterator();
while (iterator.hasNext()){
ConstraintViolation violation=(ConstraintViolation) iterator.next();
errors.put(violation.getPropertyPath().toString(),violation.getMessage());
}
return errors;
}
}
//返回list
public static Map<String,String> validateList(Collection<?> collection){
//基础校验collection是否为空
Preconditions.checkNotNull(collection);
//遍历collection
Iterator iterator=collection.iterator();
Map errors;
do {
//如果循环下一个为空直接返回空
if (!iterator.hasNext()){
return Collections.emptyMap();
}
Object object=iterator.next();
errors=validate(object,new Class[0]);
}while (errors.isEmpty());
return errors;
}
// 校验某一对象是否合法
public static Map<String,String> validateObject(Object first,Object... objects){
if (objects !=null && objects.length > 0 ){
return validateList(Lists.asList(first,objects));
} else {
return validate(first , new Class[0]);
}
}
//校验参数方法
public static void check(Object param) throws ParamException {
Map<String,String> map=BeanValidator.validateObject(param);
//如果错误集合map不为空则抛出异常
if (MapUtils.isNotEmpty(map)){
throw new ParamException(map.toString());
}
}
}
在传入参数时先校验参数
如果参数不符合规则会直接抛出异常,不会进行后面的操作
public void save(DeptParam param){
BeanValidator.check(param);
//再执行其他操作
}
常见的校验注解
@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(regex=,flag=) 被注释的元素必须符合指定的正则表达式
Hibernate Validator提供的校验注解:
@NotBlank(message =) 验证字符串非null,且长度必须大于0
@Email 被注释的元素必须是电子邮箱地址
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内