数据校验:Vaildation
前言
前言介绍了笔者所知道的最常用的技术,但是本文主要是用于Spring reviewed,所以下面步骤介绍不涉及到spring基础以外技术内容实现。
数据校验是在处理请求之前对数据进行验证的过程。Spring MVC提供了一个校验框架,可以使用注解和Validator接口来定义和执行校验规则。
1、注解
Spring MVC校验框架中最常用的注解是@Valid和@NotBlank。其中,@Valid注解用于对一个Java Bean对象进行校验,而@NotBlank注解则用于对一个String类型的数据进行非空校验。除此之外,Spring MVC校验框架还提供了许多其他的注解,包括:
- @NotNull:用于校验对象是否为null。
- @Size:用于校验字符串、集合或数组的长度。
- @Pattern:用于校验字符串是否符合正则表达式。
- @Min和@Max:用于校验数字的大小范围。
- @Email:用于校验邮箱地址是否符合规范等等。
2、Validator接口
Validator接口是Spring MVC校验框架中的另一种校验方式,它允许你自定义校验规则。要使用Validator接口,你需要实现它的validate方法,并在其中编写校验逻辑。Validator接口的使用步骤如下:
- 创建一个校验器类,实现Validator接口。
- 在校验器类中编写校验规则。
- 在Controller方法或模型(Model)对象上执行校验。
3、校验错误处理
当校验失败时,Spring MVC会生成一个包含错误信息的BindingResult对象。你可以在Controller方法或模型(Model)对象中使用BindingResult对象来获取校验失败的详细信息,并生成适当的错误响应。通常,你可以将BindingResult对象和Model对象一起传递给视图,以便在视图中显示错误信息。
综上所述,Spring MVC提供了强大的数据校验功能,可以大大简化数据校验的过程。如果你需要对请求参数或模型(Model)对象进行校验,Spring MVC的校验框架是一个非常有用的工具。
准备工作
1、引入依赖
hibernate-validator
是一个流行的Java数据校验器库,它基于JSR 380规范实现了Bean Validation 2.0 API,并提供了许多常用的校验注解和校验器。jakarta.el
是一个用于支持EL表达式的库,它是JavaEE规范的一部分,用于在Java应用程序中对数据进行动态绑定和计算。
如果你使用的是Spring Boot框架,它已经自带了数据校验器的依赖,并默认使用Hibernate Validator作为校验器实现。因此,你不需要手动配置这些依赖,只需要在代码中使用相关的注解和API即可。
<dependencies>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>7.0.5.Final</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>jakarta.el</artifactId>
<version>4.0.1</version>
</dependency>
</dependencies>
具体实现
一、注解实现:Bean Validation
常用注解说明
@NotNull 限制必须不为null
@NotEmpty 只作用于字符串类型,字符串不为空,并且长度不为0
@NotBlank 只作用于字符串类型,字符串不为空,并且trim()后不为空串
@DecimalMax(value) 限制必须为一个不大于指定值的数字
@DecimalMin(value) 限制必须为一个不小于指定值的数字
@Max(value) 限制必须为一个不大于指定值的数字
@Min(value) 限制必须为一个不小于指定值的数字
@Pattern(value) 限制必须符合指定的正则表达式
@Size(max,min) 限制字符长度必须在min到max之间
@Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式
1、创建配置类,配置LocalVaildatorFactoryBean
在Spring中使用基于注解的数据校验时,需要先配置一个LocalValidatorFactoryBean
实例,用于创建和管理校验器对象。这个校验器对象实际上就是javax.validation.Validator
接口的一个实现,它提供了一系列校验方法,可以对Java对象进行校验。在配置类中,我们使用@Bean
注解来声明一个名为validator
的方法,这个方法返回一个LocalValidatorFactoryBean
实例。这个实例会被Spring容器管理,并可以在其他组件中使用@Autowired
注解进行注入。
其次 ,LocalValidatorFactoryBean
实例需要在Spring容器中创建和管理,而不是通过new
操作符手动创建。这是因为校验器需要在创建过程中进行一些复杂的初始化和配置,例如加载校验注解、解析校验表达式、注册自定义校验器等。而Spring框架提供了一个强大的IoC容器,可以自动管理对象的生命周期和依赖关系,可以很方便地创建和管理复杂的对象。因此,我们可以通过在配置类中声明一个@Bean
方法来创建LocalValidatorFactoryBean
实例,并将其纳入Spring容器的管理范围内。这样,在其他组件中就可以通过注入validator
实例来使用校验器的功能了。
@Configuration
@ComponentScan("com.lyz.spring6.validation.method2")
public class ValidationConfig {
@Bean
public LocalValidatorFactoryBean validator() {
return new LocalValidatorFactoryBean();
}
}
代码解析:
这段代码是一个配置类,主要作用是创建一个Validator对象用于数据校验。让我们逐行分析一下:
@Configuration 这个注解表明这是一个配置类。
@ComponentScan(“com.atguigu.spring6.validation.method2”) 这个注解表示需要扫描com.lyz.spring6.validation.method2包下的组件。
public class ValidationConfig 这是一个普通的Java类,用于配置Spring应用程序。
@Bean 这个注解表示这个方法将会返回一个Bean对象,该对象会被Spring容器管理。
public LocalValidatorFactoryBean validator() 这个方法创建了一个LocalValidatorFactoryBean对象,并返回该对象。LocalValidatorFactoryBean是一个Hibernate Validator提供的实现了Spring的Validator接口的数据校验器。它可以将Hibernate Validator和Spring Validator结合起来,提供更加灵活的数据校验功能。
整个配置类的作用就是创建一个 LocalValidatorFactoryBean 对象并将其交给Spring容器管理,以便在数据校验时使用。在需要进行数据校验的Controller方法中,可以通过 @Valid 注解来使用这个数据校验器,@Valid
注解只有在Controller方法的参数列表中使用时才会生效。如果你要对其他对象进行数据校验,可以通过调用Validator
对象的validate
方法来实现。
2、创建实体类、使用注解定义校验规则
public class User {
@NotNull
private String name;
@Min(0)
@Max(120)
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
3、使用org.springframework.validation.Validator校验:
@Service