一、简单校验
1.给Bean添加校验注解,导入包为javax.validation.constraints
2.开启校验功能@Valid
只有向后端提交这个字段才会校验,没有提交不校验
3.自定义一个全局异常处理
获取数据校验错误信息,并返回json
@Slf4j
//@ControllerAdvice(basePackages = "com.atguigu.gulimallproduct.controller")
//@ResponseBody
@RestControllerAdvice(basePackages = "com.atguigu.gulimallproduct.controller") // 等于@ControllerAdvice和@ResponseBody注解
public class GulimallExceptionControllerAdvice {
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public R handleVaildException(MethodArgumentNotValidException e){
log.error("数据校验出现问题{},异常类型{}",e.getMessage(),e.getClass());
BindingResult bindingResult = e.getBindingResult();
HashMap<String, Object> errorMap = new HashMap<>();
List<FieldError> fieldErrors = bindingResult.getFieldErrors();
for (FieldError fieldError : fieldErrors) {
errorMap.put(fieldError.getField(),fieldError.getDefaultMessage());
}
return R.error(400,"数据校验出现问题").put("data",errorMap);
}
}
二、分组校验
1.新建两个接口作为标记
public interface AddGroup {
}
public interface UpdateGroup {
}
2.编写校验规则
只有指明校验分组才进行校验
3.开启校验功能
三、自定义校验
当给出的校验规则不能满足需求,可以通过自定义校验来实现,如某个字段只能为0或1
maven依赖
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
1.编写一个自定义的校验注解
@Documented
@Constraint(validatedBy = {ListValueConstraintValidator.class }) // 指定自定义校验器
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
public @interface ListValue {
String message() default "{javax.validation.constraints.NotBlank.message}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
int[] values() default { }; // 自定义数组
}
2.编写一个自定义的校验器 ConstraintValidator
// 参数为自定义注解以及其类型
public class ListValueConstraintValidator implements ConstraintValidator<ListValue,Integer> {
private Set<Integer> set = new HashSet<>();
// 初始化方法
// 参数为限制的值,如0和1
@Override
public void initialize(ListValue constraintAnnotation) {
int[] values = constraintAnnotation.values();
if (values != null){
for (int value : values) {
set.add(value);
}
}
}
// 判断是否校验成功
// value为需要校验的值
@Override
public boolean isValid(Integer value, ConstraintValidatorContext context) {
return set.contains(value);
}
}
3.给字段加自定义注解