大数跨境
0
0

Spring 强大的数据验证功能

Spring 强大的数据验证功能 Spring全家桶实战案例
2022-12-07
1
导读:Spring 强大的数据验证功能

环境:Spring5.2.23


概述

Bean Validation通过Java应用程序的约束声明和元数据提供了一种通用的验证方法。要使用它,可以使用声明性验证约束来注释域模型属性,然后由运行时强制执行。有内置约束,你也可以定义自己的自定义约束。示例如下:

public class User {  @NotEmpty(message = "姓名不能为空")  private String name ;  @Min(value = 1, message = "年龄必须大于1")  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;
@Configurationpublic class AppConfig { @Bean 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;
@Servicepublic class MyService { @Autowired private Validator validator;}

如果您的bean需要Spring Validation API,也可以向
org.springframework.validation.Validator注入引用,如下面的示例所示:

import org.springframework.validation.Validator;
@Servicepublic class MyService { @Autowired private Validator validator;}
  • 自定义验证

自定义注解

@Documented@Constraint(validatedBy = ValidEmptyConstraintValidator.class)@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })@Retention(RUNTIME)public @interface ValidEmpty {
String message() default "" ; Class<?>[] groups() default { }; Class<? extends Payload>[] payload() default { }; }

自定义验证逻辑

@Component@SuppressWarnings("rawtypes")public class ValidEmptyConstraintValidator implements ConstraintValidator<ValidEmpty, Collection> {
@Override 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上下文中:

@Configurationpublic class AppConfig {  @Bean  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 {  @NotEmpty(message = "姓名不能为空")  private String name ;  private Integer age ;}@Validatedpublic class UserService {  public void findById(@NotNull(message = "ID不能为空") 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)

完毕!!!


【声明】内容源于网络
0
0
Spring全家桶实战案例
Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
内容 832
粉丝 0
Spring全家桶实战案例 Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
总阅读841
粉丝0
内容832