JSR303后端数据校验

一、简单校验

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.给字段加自定义注解
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值