-
参数校验背景
- 通常在Spring Boot中,参数校验是在Controller控制层完成的。
- 文章探讨了在非Controller控制层进行参数校验的方法。
-
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)
:验证给定属性值是否符合约束条件,无需创建对象实例。
- Spring提供了JSR-303的一个变种
-
Validator接口的使用
- 依赖Spring容器 :
- 通过Spring容器注入
Validator
接口的实现类。 - 示例代码展示了如何在Spring Boot中使用
Validator
进行参数校验。
- 通过Spring容器注入
- 不依赖Spring容器 :
- JSR 303是一种规范,不依赖Spring容器,可以在任何Java项目中使用。
- 通过
ValidatorFactory
获取Validator
接口的实现。 - 示例代码展示了如何在非Spring项目中使用
Validator
进行参数校验。
- 依赖Spring容器 :
-
示例代码
-
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使用 :
javapublic 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
的代码封装成工具类,统一管理校验方法。