java后端如何做数据校验 JSR303校验 分组校验 自定义校验

开启校验

  1. 添加依赖:
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
        <version>2.6.6</version>
    </dependency>
    
  2. 在实体类的字段上添加注解
    如:
    @NotEmpty
    @NotBlank
    @URL(message = "logo必须是一个合法的url地址")
    自定义校验格式就用@Pattern
    @Pattern(regexp = "/^[a-zA-Z]$/", message = "检索首字母必须是一个字母")
    @Min(value = 0, message = "排序必须大于等于0")
  3. 在接收参数的方法的形参上加上@Valid注解

但如果出现以下问题:
比如相同的Entity, 插入的时候这个字段必须为空, 修改的时候就不能为空, 就很难办了. 例如修改商品时候商品的id.
解决办法:

分组校验:

先自定义两个空接口, 一个是表示增加的接口AddGroup, 一个表示修改的接口UpdateGroup
把@Valid换成@Validated({xxxGroup.class})
然后在Entity中每个使用校验的地方后面加个groups = {xxxGroup.class}
如果不写默认不参加校验

自定义校验

  1. 编写自定义校验注解, 这里message从配置的ValidationMessages.properties中取得
    配置: com.haozhancc.common.valid.ListValue.message=必须提交指定的值
    @Documented
    @Constraint(
            validatedBy = { ListValueConstraintValidator.class }
    )
    @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface ListValue {
        String message() default "{com.haozhancc.common.valid.ListValue.message}";
    
        Class<?>[] groups() default {};
    
        Class<? extends Payload>[] payload() default {};
    
        int[] vals() default { };
    }
    
  2. 编写自定义校验器
    @Slf4j
    @RestControllerAdvice(basePackages = "com.haozhancc.gulimall.product.controller")
    public class GulimallExceptionControllerAdvice {
    
        @ExceptionHandler(value = MethodArgumentNotValidException.class)
        public R handleVaildException(MethodArgumentNotValidException e) {
            log.error("数据校验出现问题{}, 异常类型: {}", e.getMessage(), e.getClass());
            BindingResult bindingResult = e.getBindingResult();
    
            Map<String, String> errorMap = new HashMap<>();
            bindingResult.getFieldErrors().forEach((fieldError -> {
                errorMap.put(fieldError.getField(), fieldError.getDefaultMessage());
            }));
            return R.error(BizCodeEnume.VAILD_EXCEPTION.getCode(), BizCodeEnume.VAILD_EXCEPTION.getMsg()).put("data", errorMap);
        }
    
        @ExceptionHandler(value = Throwable.class)
        public R handleException(Throwable throwable) {
    
            log.error("错误: ", throwable);
            return R.error(BizCodeEnume.UNKNOW_EXCEPTION.getCode(), BizCodeEnume.UNKNOW_EXCEPTION.getMsg());
        }
    }
    
  3. 绑定自定义校验器和自定义注解之间的关联, 就用
    @Constraint(
            validatedBy = { ListValueConstraintValidator.class }
    )
    
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值