目的:
前端虽然可以对输入的内容进行约束,但若是使用测试工具类 比如:postman ,依然可以任意输入各种数据,如果后端拿到数据后不进行校验,容易被钻空子。
使用JSR303参数校验规范步骤
一、 使用自带注解
添加依赖
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
使用注解开启校验功能
在controller接受参数之前 添加@Validated(value = {xxxGroup.class})
这个xxxGroup.class是自己编写的接口类 空接口即可
在实体类的字段上 标注需要的注解
比如id字段不能为空
@NotNull(message = "id不能为空", groups = {xxxGroup.class})
@TableId
private Long id;
二、自定义注解
前两步同上
1. 添加依赖
2.使用注解开启校验功能
在实体类的字段上添加自定义注解
@xxx(value = {0,1})
private Integer status;
编写自定义注解
@Documented
@Constraint(validatedBy = {XxxConstraintValidator.class}) /*这里是将自定义注解和构造器进行关联*/
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface xxx {
String message() default "{com.atguigu.common.valid.ListValue.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
int[] value();
}
编写自定义校验器
public class XxxConstraintValidator implements ConstraintValidator<ListValue, Integer> {
private Set<Integer> set = new HashSet<>();
/*初始化方法*/
@Override
public void initialize(ListValue constraintAnnotation) {
int[] value = constraintAnnotation.value();
if (value != null && value.length> 0){
for(int val: value){
set.add(val);
System.out.println("val: "+val);
}
}
}
/*校验规则*/
@Override
public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) {
return set.contains(value);
}
}