分组校验需要指定groups 需要@Validated 需要创建相应的接口
设置不同分组可以设置不同状态下的校验规则
//接口什么都不用写 创建就行
public interface UpdateGroup {}
public interface AddGroup{}
@NotNull(message = "修改必须指定ID",groups = {UpdateGroup.class})
@Null(message = "新增不能指定ID",groups = {AddGroup.class})
@TableId
private Long brandId;
参数加上 @Valid(不支持分组) 或 @Validated 注解
@RequestMapping("/save")
public R save(@Validated(AddGroup.class) @RequestBody BrandEntity brand BindingResult result){
if (result.hasErrors()){
System.out.println("HAS ERROR====================");
Map<String, String> map = new HashMap<>();
result.getFieldErrors().forEach(item -> {
String message = item.getDefaultMessage();//错误消息
String field = item.getField();//错误的属性名字
map.put(field,message);
});
return R.error(400,"提交的数据不合法").put("data",map);
}
brandService.save(brand);
return R.ok();
}
常用校验
@NotNull
@Null
@NotBlank
@NotEmpty
@URL
@Pattern(regexp = "^[a-zA-Z]$",message = "检索首字母必须是英文字母")
@Min
自定义校验注解
//新建Annotation CustomAnnotation
@Documented
@Constraint(validatedBy = {CustomConstraintValidator.class})
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
public @interface CustomAnnotation {
String message() default "{com.atguigu.common.valid.CustomAnnotation.message}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
int[] value() default {};
}
//实现CustomAnnotation
public class CustomConstraintValidator implements ConstraintValidator<CustomAnnotation,Integer>{
private Set<Integer> set = new HashSet<>();
//初始化方法
@Override
public void initialize(CustomAnnotation constraintAnnotation) {
int[] value = constraintAnnotation.value();
for (int val : value) {
set.add(val);
}
}
/**
* @Description //判断是否校验成功
* @Param value: 需要校验的值
* @Param context:
* @return boolean
*/
@Override
public boolean isValid(Integer value, ConstraintValidatorContext context) {
return set.contains(value);
}
}