环境:Spring5.2.23
概述
Bean Validation通过Java应用程序的约束声明和元数据提供了一种通用的验证方法。要使用它,可以使用声明性验证约束来注释域模型属性,然后由运行时强制执行。有内置约束,你也可以定义自己的自定义约束。示例如下:
public class User {private String name ;private Integer age ;}
接下来,Bean Validation validator 根据声明的约束验证该类的实例。有关API的一般信息,请参阅
https://beanvalidation.org/。有关特定约束,请参阅Hibernate Validator文档
https://hibernate.org/validator/。
配置验证提供程序
Spring提供了对Bean验证API的全面支持,包括将Bean验证提供程序配置为Spring Bean。这允许你在应用程序中需要验证的任何地方注入
javax.validation.ValidatorFactory或
javax.validation.Validator。
你可以使用LocalValidatorFactoryBean将默认的Validator配置为Spring bean,如下例所示:
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;public class AppConfig {public LocalValidatorFactoryBean validator() {return new LocalValidatorFactoryBean();}}
上例中的基本配置自动触发bean验证以初始化。Bean验证提供程序(如:Hibernate Validator)应该出现在类路径中,并被自动检测到。
注入验证器
LocalValidatorFactoryBean实现了javax.validation. validatorfactory和
javax.validation.Validator,以及Spring的
org.springframework.validation.Validator。你可以将对这些接口的引用注入到需要调用验证逻辑的bean中。
如果你更喜欢直接使用Bean验证API,你可以向
javax.validation.Validator注入一个引用,如下面的例子所示:
import javax.validation.Validator;public class MyService {private Validator validator;}
如果您的bean需要Spring Validation API,也可以向
org.springframework.validation.Validator注入引用,如下面的示例所示:
import org.springframework.validation.Validator;@Servicepublic class MyService {@Autowiredprivate Validator validator;}
自定义验证
自定义注解
public ValidEmpty {String message() default "" ;Class<?>[] groups() default { };Class<? extends Payload>[] payload() default { };}
自定义验证逻辑
("rawtypes")public class ValidEmptyConstraintValidator implements ConstraintValidator<ValidEmpty, Collection> {public boolean isValid(Collection value, ConstraintValidatorContext context) {return !(value == null || value.isEmpty()) ;}}
注意:上面的@Component注解加后会自动将该验证器被管理。
使用
@ValidEmpty(message = "集合不能为空")private List<String> list ;
方法参数返回值验证
你可以通过
MethodValidationPostProcessor Bean定义将Bean validation 1.1(以及Hibernate Validator 4.3作为自定义扩展)支持的方法验证特性集成到Spring上下文中:
public class AppConfig {public MethodValidationPostProcessor validationPostProcessor() {return new MethodValidationPostProcessor();}}
要符合Spring驱动方法验证的条件,所有目标类都需要用Spring的@Validated注释进行注释,该注释还可以选择性地声明要使用的验证组。有关Hibernate验证器和Bean验证1.1提供程序的设置细节,请参阅
MethodValidationPostProcessor
https://docs.spring.io/spring-framework/docs/5.3.24/javadoc-api/org/springframework/validation/beanvalidation/MethodValidationPostProcessor.html。
使用方法如下:
public class User {private String name ;private Integer age ;}public class UserService {public void findById( Long id) {}}GenericApplicationContext context = new GenericApplicationContext() ;AnnotatedBeanDefinitionReader reader = new AnnotatedBeanDefinitionReader(context) ;// 注册Beanreader.registerBean(MethodValidationPostProcessor.class) ;reader.registerBean(UserService.class) ;context.refresh() ;UserService us = context.getBean(UserService.class) ;User user = new User() ;us.save(user) ;us.findById(null) ;context.close() ;
执行结果:
Exception in thread "main" javax.validation.ConstraintViolationException: findById.arg0: ID不能为空at org.springframework.validation.beanvalidation.MethodValidationInterceptor.invoke(MethodValidationInterceptor.java:120)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708)at com.pack.main.validator.UserService$$EnhancerBySpringCGLIB$$37e0abae.findById(<generated>)at com.pack.main.validator.Main.main(Main.java:19)
完毕!!!





