非Controller控制层参数校验怎么办

  1. 参数校验背景

    • 通常在Spring Boot中,参数校验是在Controller控制层完成的。
    • 文章探讨了在非Controller控制层进行参数校验的方法。
  2. Validator接口

    • Spring提供了JSR-303的一个变种@Validated
    • Validator接口定义了用于执行验证的方法,主要方法包括:
      • validate(T object, Class<?>... groups):验证对象是否符合约束条件。
      • validateProperty(T object, String propertyName, Class<?>... groups):验证对象的特定属性是否符合约束条件。
      • validateValue(Class<T> beanType, String propertyName, Object value, Class<?>... groups):验证给定属性值是否符合约束条件,无需创建对象实例。
  3. Validator接口的使用

    • 依赖Spring容器
      • 通过Spring容器注入Validator接口的实现类。
      • 示例代码展示了如何在Spring Boot中使用Validator进行参数校验。
    • 不依赖Spring容器
      • JSR 303是一种规范,不依赖Spring容器,可以在任何Java项目中使用。
      • 通过ValidatorFactory获取Validator接口的实现。
      • 示例代码展示了如何在非Spring项目中使用Validator进行参数校验。
  4. 示例代码

    • UserBean类

      java 复制代码
      @Data
      public class UserBean {
          @NotBlank
          private String username;
      
          @Min(value = 18)
          private Integer age;
      }
    • Spring Boot中的Validator使用

      java 复制代码
      @SpringBootTest
      class SpringbootPracticeApplicationTests {
          @Resource
          private Validator validator;
      
          @Test
          public void testValidator(){
              UserBean userBean = new UserBean();
              userBean.setAge(17);
              userBean.setUsername(null);
      
              Set<ConstraintViolation<UserBean>> constraintViolations = validator.validate(userBean);
              System.out.println("validate 校验对象属性:");
              System.out.println(constraintViolations);
      
              constraintViolations = validator.validateProperty(userBean, "age");
              System.out.println("validateProperty校验age属性是否合规:");
              System.out.println(constraintViolations);
      
              constraintViolations = validator.validateValue(UserBean.class , "age", 14 );
              System.out.println("validateValue校验age属性的值是否合规:");
              System.out.println(constraintViolations);
          }
      }
    • 非Spring项目中的Validator使用

      java 复制代码
      public class ValidationUtils {
          public static Validator getValidator(){
              ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
              return factory.getValidator();
          }
      }
      
      public class ValidatorTest {
          public static void main(String[] args) {
              Validator validator = ValidationUtils.getValidator();
              UserBean userBean = new UserBean();
              userBean.setAge(17);
              userBean.setUsername(null);
      
              Set<ConstraintViolation<UserBean>> constraintViolations = validator.validate(userBean);
              System.out.println("validate 校验对象属性:");
              System.out.println(constraintViolations);
      
              constraintViolations = validator.validateProperty(userBean, "age");
              System.out.println("validateProperty校验age属性是否合规:");
              System.out.println(constraintViolations);
      
              constraintViolations = validator.validateValue(UserBean.class , "age", 14 );
              System.out.println("validateValue校验age属性的值是否合规:");
              System.out.println(constraintViolations);
          }
      }

测试结果

  • 校验对象属性
    • 显示违反约束条件的字段及其提示信息。
  • 校验特定属性
    • 仅显示特定属性违反约束条件的提示信息。
  • 校验属性值
    • 显示给定属性值是否符合约束条件的提示信息。

总结

  • 依赖Spring容器的方法和不依赖Spring容器的方法。
  • 建议使用不依赖Spring容器的方法,可以将获取Validator的代码封装成工具类,统一管理校验方法。
相关推荐
小江的记录本5 小时前
【JVM虚拟机】垃圾回收GC:四种引用类型:强引用、软引用、弱引用、虚引用(附《思维导图》+《面试高频考点清单》)
java·jvm·spring boot·后端·python·spring·面试
小马爱打代码5 小时前
Spring源码 第四篇:Spring 5 源码深度拆解:AOP 全流程核心原理
java·后端·spring
RyFit5 小时前
Java + AI 实战:Spring AI 从入门到企业级落地
java·人工智能·spring
java1234_小锋8 小时前
在 Spring AI 中如何实现函数调用(Function Calling)?请说明其基本原理和应用场景。
java·人工智能·spring
小马爱打代码8 小时前
Spring源码 第九篇:Spring 5 源码深度拆解 - Spring 事件驱动模型
java·后端·spring
云烟成雨TD10 小时前
Spring AI Alibaba 1.x 系列【60】检查点机制原理与全流程剖析
java·人工智能·spring
小马爱打代码10 小时前
Spring源码 第十篇:Spring 5 源码深度拆解 - Spring 类型转换与校验体系
java·spring
2301_7807896610 小时前
高防cdn如何缓存网页静态资源
java·spring·web安全·缓存·kubernetes·ddos
小马爱打代码10 小时前
Spring源码 第十一篇:Spring 扩展点全解析 - 从容器启动到 Bean 生命周期的完整执行时序
java·后端·spring
武子康12 小时前
Java-08 深入浅出 Mybatis 数据库多对多关系设计:中间表、映射与性能优化
java·后端·spring