Spring – Spring Validation 校验
简介
Spring Validation 是由Spring 提供的应用于字段数据校验的包,我们可以使用它对某些字段进行合理的数据校验功能。
引入依赖
Spring Validation 由Spring提供,因此它包含有 Starter 起步依赖
我们可能通过增加以下依赖坐标得到包的引用
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
基本字段校验
对于某些基础字段,Validation 预先提供给我们,我们可以直接使用预置的校验即可。
@NotNull
@NotNull 会指定该字段接收时不允许为 Null,否则会报出异常,如下案例,我们可以对实体类中的字段进行校验
@NotNull()
private Integer id;//主键ID
也可以对Controller接收参数中进行数据校验
@PostMapping()
public Result add(@RequestBody @NotNull Article article){
articleService.add(article);
return Result.success();
}
message: 当校验不通过时,会使用这个作为提示
groups: 校验分组,只有符合某个条件时,才会使用这个校验
@NotEmpty
@NotEmpty 会指定该字段接收的数据不允许为空(非Null),否则会报出异常,如下案例:我们可以对实体类中的字段进行校验
@NotEmpty
private String content;//文章内容
message: 当校验不通过时,会使用这个作为提示
groups: 校验分组,只有符合某个条件时,才会使用这个校验
@URL
故名思义,就是要求该字段中的数据必须为 url 格式的,否则会报出异常,如下案例为,该字段必须不能为空,且内容必须符合 url 格式
@NotEmpty
@URL
private String coverImg;//封面图像
message: 当校验不通过时,会使用这个作为提示
groups: 校验分组,只有符合某个条件时,才会使用这个校验
故名思义,就是要求该字段中的数据必须为 邮箱地址 格式的,否则会报出异常
@NotEmpty
@Email
private String email;
message: 当校验不通过时,会使用这个作为提示
groups: 校验分组,只有符合某个条件时,才会使用这个校验
注意
如果使用字段校验方式对字段进行校验时,我们需要在接收数据时,在Controller 中加入 @Validated 注解,如下
@PostMapping()
public Result add(@RequestBody @Validated Article article){
articleService.add(article);
return Result.success();
}
否则字段中的校验注解可能不会生效
校验分组定义
当我使用 @NotNull 对 Id 做字段校验时,当我新增时,不需要提供Id,但校验却拦截了
解决:可以使用分组校验:
分组效验是指定某些情况下需要校验,而某些情况下不需要校验。如新增时不校验,修改时则校验
可以创建一个 interface 接口,作为标记用,在校验注解处使用 group 定义什么时候才进行校验
// 用于定义标记校验分组的接口
public interface Add extends Default { }
public interface Update extends Default{ }
如下:
@NotNull(groups = {Update.class})
private Integer id;//主键ID
扩展:如果校验中,某一些成员变量在任何时候都应该被校验时,我们不需要像上面那样,把所有定义的标记都记上
而是让它们都继承 Default 接口,则作为默认组的校验
默认组校验不需要定义 groups
如下:
@NotEmpty() // 默认使用 Default 校验组
private String categoryName;
那么在 Controller 接收数据时,@Validated 就可以定义当前的操作,使校验分组生效
@Validated({Category.Update.class}) 则会指定包含该接口的分组才全被效验
如下:
@PutMapping("/category")
public Result updateCategory(@RequestBody @Validated({Category.Update.class}) Category category){
return Result.success(categoryService.update(category));
}
自定义字段校验
对于一些特殊情况下,Validation 所自带的校验方式已经不满足我们使用时,我们可以通过自定义校验方式,对字段数据做特殊的数据校验。
步骤:
1.创建一个注解,用于标记在字段上面,触发自定义校验。
2.创建一个类,继承 ConstraintValidator 接口中的方法,这个方法是用于处理校验逻辑的
3.在自定义的注解上,加上 @Constraint 注解,用于定义绑定校验逻辑类,绑定后,则这个注解将带有对应的校验功能。
实施:
1.创建一个注解:
@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint()
public @interface State {
// 提供校验失败之后的提示信息
String message() default "State参数的值只能是【已发布】或【草稿】";
// 校验使用分组
Class<?>[] groups() default {};
// 负载 获取到State注解的附加信息
Class<? extends Payload>[] payload() default {};
}
2.创建一个用于处理校验逻辑的类
/**
*
* ConstraintValidator<给哪个注解提供校验规则,校验的数据类型>
*/
public class StateValidation implements ConstraintValidator<State,String> {
@Override
public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
if (value == null) return false;
if (value.equals("已发布") || value.equals("草稿")) return true;
return false;
}
3.在注解中绑定 2. 中创建的类
@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {StateValidation.class})
public @interface State {
// 提供校验失败之后的提示信息
String message() default "State参数的值只能是【已发布】或【草稿】";
// 校验使用分组
Class<?>[] groups() default {};
// 负载 获取到State注解的附加信息
Class<? extends Payload>[] payload() default {};
}
这样,在字段中直接使用这个注解,将可以实现自定义校验逻辑处理。
正则表达式校验
@Pattern
@Pattern 可以支持使用正则表达式来对数据进行校验
@Pattern(regexp = "^\\S{6,15}$")
private String content;
共有 0 条评论