spring boot使用JSR-303做数据校验

Updated on in 程序人生 with 0 views and 0 comments

1、JSR-303数据校验简介

JSR是Java Specification Requests的缩写,意思是Java 规范提案,JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation,即,JSR 303,Bean Validation规范 ,为Bean验证定义了元数据模型和API

2、pom引入

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

3、常见注解

image.png

4、定义组

在校验的时候,同一个字段在不同的业务场景下,校验规则可能会有差异需要进行不同的校验就可以通过分组实现,下述代码中,创建了两个分组,AddGroup用于处理新增数据的校验,UpdateGroup用于标识修改数据的校验

public interface AddGroup {
}
public interface UpdateGroup {
}

这里指定了当我接口校验的分组为AddGroup时进行Null校验,若接口校验分组为UpdateGroup则进行NotNull校验(新增时不能指定ID,修改时必须指定ID)

	@Null(message = "新增不能指定ID",groups = {AddGroup.class})
	@NotNull(message = "修改必须指定ID",groups = {UpdateGroup.class})
	private Long id;

下面看两个接口,在接口中通过@Validated注解指定启用那个group,例如save方法启用AddGroup分组的校验,update方法启用UpdateGroup分组的校验

    @RequestMapping("/save")
    public R save(@Validated({AddGroup.class}) @RequestBody BrandEntity brand){
        brandService.save(brand);
        return R.ok();
    }
    @RequestMapping("/update")
    public R update(@Validated({UpdateGroup.class}) @RequestBody BrandEntity brand){
		brandService.updateById(brand);

        return R.ok();
    }

5、自定义校验注解

5.1 定义一个接口

这个接口message、groups、payload参数是必须的,这里我添加了一个int数组,用于接收用户传入的值,我希望通过这个接口判断请求接口的数据,是否在注解定义的值中,例如我规定他只能传入[0,1],那我在使用DeleteValid注解时,就要指定注解的value为{0,1}

@Documented
@Constraint(validatedBy = {DeleteValidator.class})
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
public @interface DeleteValid {
    String message() default "{com.mall.thirdparty.valid.DeleteValid.message}";

    Class<?>[] groups() default { };

    Class<? extends Payload>[] payload() default { };
    int[] values() default  {};
}

5.2 定义message

校验方法的message有个默认信息,在resources目录下新建ValidationMessages.properties文件在里面填写默认信息com.mall.thirdparty.valid时注解所在的包,加上类名.message即可定义校验返回信息

com.mall.thirdparty.valid.DeleteValid.message = 请输入0或1

5.3 定义校验器

注解中的代码制定了具体校验的类 @Constraint(validatedBy = {DeleteValidator.class})

新建DeleteValidator类,这里validatedBy可以时多个类,表明标识了这个注解的字段,会有以下几个校验器参与校验,代码中有个initialize方法,将用户传递的参数放到set中,然后通过isValid判断用户输入的参数与注解规定的参数是否匹配

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.HashSet;
import java.util.Set;

public class DeleteValidator implements ConstraintValidator<DeleteValid,Integer> {
    private Set<Integer> set = new HashSet<>();
    @Override
    public void initialize(DeleteValid constraintAnnotation) {
        int[] values = constraintAnnotation.values();
        for(int value:values){
            set.add(value);
        }
    }
    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext context) {
        return set.contains(value);
    }
}

5.4 使用

如下所示,我引入了前面定义的DeleteValid注解,规定了values为0或者1,那用户传递到系统中进行校验时,就不能输入其他值了

	@DeleteValid(values = {0,1},groups = {AddGroup.class, UpdateGroup.class})
	private Integer showStatus;

标题:spring boot使用JSR-303做数据校验
作者:wenyl
地址:http://www.wenyoulong.com/articles/2023/05/31/1685524967296.html