前言
Bean Validation是一个验证参数的规范,能简化代码,让我们尽量避免写很多的冗余的代码来校验输入参数的正确性,特别是暴露给外部用的api,必须要做参数验证,下面就将常用的验证方式做一个记录。
步骤
- 1) pom中引入Bean validation的实现hibernate-validator
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.13.Final</version>
</dependency>
- 2)定义接收参数的实体,加上验证注解
@NotNull(message = "姓名不能为空!")
private String name;
@NotEmpty(message = "手机号不能为空及空字符")
@Size(min = 11, max = 11, message = "手机号为11位")
private String phone;
- 3) 创建校验器,编写测试类
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
/**
* 校验规则:object != null;
*/
@Test
public void testNotNull(){
User user = new User();
user.setName("侠梦"); //size=0
// user.setName(""); //size =0
// user.setName(null); //size = 1
Set<ConstraintViolation<User>> violations = validator.validate(user);
Assert.assertEquals(violations.size(),0);
}
- 4) 结合java8升华校验
- 校验集合内部的元素,注意正确写法是写在声明的泛型类型前面,而不是像传统校验一样另起一行,这样会导致异常No validator could be found for constraint ‘javax.validation.constraints.NotBlank’ validating type 'java.util.List<java.lang.String>
private List<@NotBlank(message = "存在的邮箱元素不能为空") String> emails;
private Map<@Email String, @NotNull User> customers;
- 结合Optional校验
private Integer age;
public Optional<@Min(18) Integer> getAge() {
return Optional.ofNullable(age);
}
- 5)自定义验证器
- 开发中,经常会有很多字段,固定就只能是一些范围内的值,我们可以自定义一个验证器来约束它们,例如:用户来源这个字段,只会有三种,微信、qq和微博,首先我们定义一个@interface注解,通过Constraint的validatedBy指定一个验证器,在验证器中,实现ConstraintValidator接口,覆写isValid方法,让@UserSource校验的字段,只能是这三个值。
@Retention(RetentionPolicy.RUNTIME)
@Target( { ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD })
@Constraint(validatedBy = {UserTypeValidator.class})
@Documented
public @interface UserSource {
String message() default "用户来源不正确,请检查!";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public class UserTypeValidator implements ConstraintValidator<UserSource, String> {
private List<String> sources = Arrays.asList(new String[]{"wechat","qq","weibo"});
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return sources.contains(value);
}
}
@UserSource(message = "错误的用户来源!")
private String source;
- 6)总结
- 日常开发中,大多都没有在数据库设置外键关系,而是用应用程序来维护,所以参数的校验是十分重要的,在程序保存记录前,可以使用validation来校验输入的参数,如果不满足规则,则抛出异常,避免存入脏数据。