JSR是Java Specification Requests的缩写,意思是Java 规范提案,JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation,即,JSR 303,Bean Validation规范 ,为Bean验证定义了元数据模型和API
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
在校验的时候,同一个字段在不同的业务场景下,校验规则可能会有差异需要进行不同的校验就可以通过分组实现,下述代码中,创建了两个分组,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();
}
这个接口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 {};
}
校验方法的message有个默认信息,在resources目录下新建ValidationMessages.properties文件在里面填写默认信息com.mall.thirdparty.valid时注解所在的包,加上类名.message即可定义校验返回信息
com.mall.thirdparty.valid.DeleteValid.message = 请输入0或1
注解中的代码制定了具体校验的类 @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);
}
}
如下所示,我引入了前面定义的DeleteValid注解,规定了values为0或者1,那用户传递到系统中进行校验时,就不能输入其他值了
@DeleteValid(values = {0,1},groups = {AddGroup.class, UpdateGroup.class})
private Integer showStatus;