Bean Validation参数校验笔记

前言

Bean Validation是一个验证参数的规范,能简化代码,让我们尽量避免写很多的冗余的代码来校验输入参数的正确性,特别是暴露给外部用的api,必须要做参数验证,下面就将常用的验证方式做一个记录。

步骤
  • 1) pom中引入Bean validation的实现hibernate-validator

  
  
  
  1. <dependency>

  2.            <groupId>org.hibernate</groupId>

  3.            <artifactId>hibernate-validator</artifactId>

  4.            <version>6.0.13.Final</version>

  5.        </dependency>

  • 2)定义接收参数的实体,加上验证注解

  
  
  
  1.   @NotNull(message = "姓名不能为空!")

  2.    private String name;


  3.    @NotEmpty(message = "手机号不能为空及空字符")

  4.    @Size(min = 11, max = 11, message = "手机号为11位")

  5.    private String phone;

  • 3) 创建校验器,编写测试类

  
  
  
  1. Validator validator = Validation.buildDefaultValidatorFactory().getValidator();


  2.   /**

  3.     * 校验规则:object != null;

  4.     */

  5.    @Test

  6.    public void testNotNull(){

  7.        User user = new User();

  8.        user.setName("侠梦"); //size=0

  9. //        user.setName(""); //size =0

  10. //        user.setName(null); //size = 1

  11.        Set<ConstraintViolation<User>> violations = validator.validate(user);

  12.        Assert.assertEquals(violations.size(),0);

  13.    }

  • 4) 结合java8升华校验

  • 校验集合内部的元素,注意正确写法是写在声明的泛型类型前面,而不是像传统校验一样另起一行,这样会导致异常No validator could be found for constraint 'javax.validation.constraints.NotBlank' validating type 'java.util.List

  
  
  
  1.  private List<@NotBlank(message = "存在的邮箱元素不能为空") String> emails;


  2.   private Map<@Email String, @NotNull User> customers;

  • 结合Optional校验

  
  
  
  1. private Integer age;

  2.    public Optional<@Min(18) Integer> getAge() {

  3.        return Optional.ofNullable(age);

  4.    }

  • 5)自定义验证器

  • 开发中,经常会有很多字段,固定就只能是一些范围内的值,我们可以自定义一个验证器来约束它们,例如:用户来源这个字段,只会有三种,微信、qq和微博,首先我们定义一个@interface注解,通过Constraint的validatedBy指定一个验证器,在验证器中,实现ConstraintValidator接口,覆写isValid方法,让@UserSource校验的字段,只能是这三个值。

  
  
  
  1. @Retention(RetentionPolicy.RUNTIME)

  2. @Target( { ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD })

  3. @Constraint(validatedBy = {UserTypeValidator.class})

  4. @Documented

  5. public @interface UserSource {

  6.    String message() default "用户来源不正确,请检查!";

  7.    Class<?>[] groups() default {};

  8.    Class<? extends Payload>[] payload() default {};

  9. }

  10. public class UserTypeValidator implements ConstraintValidator<UserSource, String> {

  11.    private List<String> sources = Arrays.asList(new String[]{"wechat","qq","weibo"});

  12.    @Override

  13.    public boolean isValid(String value, ConstraintValidatorContext context) {

  14.       return sources.contains(value);

  15.    }

  16. }


  17. @UserSource(message = "错误的用户来源!")

  18. private String source;

  • 6)总结

  • 日常开发中,大多都没有在数据库设置外键关系,而是用应用程序来维护,所以参数的校验是十分重要的,在程序保存记录前,可以使用validation来校验输入的参数,如果不满足规则,则抛出异常,避免存入脏数据。


本文分享自微信公众号 - 侠梦的开发笔记(xmdevnote)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章