BeanValidation参数校验笔记

前言

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来校验输入的参数,如果不满足规则,则抛出异常,避免存入脏数据。
    在这里插入图片描述
发布了106 篇原创文章 · 获赞 21 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/u012811805/article/details/84932258