API接口参数验证的必备神器,让你的代码更高效!

2023年 11月 7日 72.4k 0

环境:Springboot2.6.12

1. 简介

Spring Validation是一种轻量级的数据验证框架,主要用于对Java对象进行校验。它为数据验证提供了统一的接口和基本的校验功能,解决了数据校验这一常见问题,让开发人员能够方便地对数据进行验证,从而保证数据的有效性和安全性。

Spring Validation提供了一套注解,用于对Java对象进行校验,支持嵌套校验和分组校验,支持国际化和自定义注解和校验器,可以满足各种复杂的校验需求。它的主要特点包括:

  • 轻量级:Spring Validation只做验证相关的事情,不包含复杂的业务逻辑。
  • 简单易用:基于注解,简洁明了,易于维护。
  • 校验规则灵活:支持自定义校验规则,可扩展性强。
  • 支持国际化:根据不同的语言环境,使用不同的校验提示消息。
  • 集成Hibernate Validator:Spring Validation默认使用Hibernate Validator作为其具体的实现,可以轻松地与其他数据验证框架一起工作。
  • Bean Validation 为Java应用程序提供了一种通过约束声明和元数据进行验证的通用方法。要使用它,只需要对POJO属性进行注释,然后由运行时强制执行这些约束。有内置的约束,你也可以定义自己的自定义约束。如下所示:

    public class Person {
    
    
      @NotNull
      @Size(max=64)
      private String name;
      @Min(0)
      private int age;
    
    
    }

    Bean验证验证器然后根据声明的约束验证此类的实例。有关API的一般信息,请参见Bean验证。有关特定约束,请参阅Hibernate验证程序文档。

    配置Bean验证提供程序

    Spring提供了对Bean验证API的全面支持,包括将Bean验证提供者作为Spring Bean。这使你可以在应用程序中需要验证的任何位置注入javax.validation.ValidatorFactory或javax.validation.Validator。

    你可以使用LocalValidatorFactoryBean将默认验证器配置为Spring Bean,如下例所示:

    import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
    
    
    @Configuration
    public class AppConfig {
    
    
      @Bean
      public LocalValidatorFactoryBean validator() {
        return new LocalValidatorFactoryBean();
      }
    
    
    }

    上面的示例中的基本配置使用默认引导机制触发bean验证进行初始化。Bean验证提供程序(如Hibernate验证程序)应该出现在类路径中,并被自动检测到。

    2. 注入 Validator

    @Service
    public class PersonService {
      // inject javaee validator object
      @Resource
      private Validator validator ;
      // inject spring validator object
      @Resource
      private org.springframework.validation.Validator valid ;
    }

    简单实例

    接着上面的配置,我们只需要做验证动作即可。

    @Service
    public class PersonService {
    
    
      @Resource
      private Validator validator ;
      @Resource
      private org.springframework.validation.Validator valid ;
    
    
    
    
      public void validator(Person person) {
        Set res = validator.validate(person) ;
        res.forEach(cv -> {
          System.out.println(cv.getMessage()) ;
        });
        System.out.println("----------------------") ;
        BindingResult errors = new MapBindingResult(new HashMap(), "person") ;
        valid.validate(person, errors) ;
        if (errors.hasErrors()) {
          errors.getAllErrors().forEach(oe -> {
            System.out.println(oe.getDefaultMessage()) ;
          });
        }
      }
    
    
    }

    测试

    @SpringBootTest
    class SpringBootValidationApplicationTests {
    
    
      @Resource
      private PersonService ps ;
    
    
      @Test
      public void testValidator() {
        Person person = new Person() ;
        person.setAge(-1);
        ps.validator(person) ;
      }
    
    
    }
    最小不能小于0
    不能为null
    ----------------------
    最小不能小于0
    不能为null

    3. 自定义注解验证

    每个Bean验证约束由两部分组成:

    • 声明约束及其可配置属性的@Constraint注释。
    • 实现约束行为的javax.validation.ConstraintValidator接口的实现。

    要将声明与实现关联,每个@Constraint注释都会引用相应的ConstraintValidator实现类。在运行时,当域模型中遇到约束注释时,ConstraintValidatorFactory将实例化引用的实现。下面的示例实现一个前缀匹配的验证逻辑:

    自定义注解

    @Target({ElementType.METHOD, ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(validatedBy = PrefixConstraintValidator.class)
    public @interface PrefixConstraint {

    String value() default "" ;
    // 这里的{validator.prefix.error}就是资源文件中定义的错误信息
    String message() default "{validator.prefix.error}";

    Class[] groups() default { };

    Class

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论