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


    开启校验

    1. 添加依赖:
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-validation</artifactId>
          <version>2.6.6</version>
      </dependency>
      
      • 1
      • 2
      • 3
      • 4
      • 5
    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 { };
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
    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());
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
    3. 绑定自定义校验器和自定义注解之间的关联, 就用
      @Constraint(
              validatedBy = { ListValueConstraintValidator.class }
      )
      
      • 1
      • 2
      • 3
  • 相关阅读:
    win11卸载软件在哪里?
    CSS复习之选择器
    申报国家高新技术企业有什么好处?
    绿色低碳天翼云,数字经济新引擎
    Vue Patch,忙啥呢?
    Linux进程间通信—信号量
    JAVA毕业设计客服管理系统计算机源码+lw文档+系统+调试部署+数据库
    google工程:更新广告SDK,后台隐私政策的设置优化
    Redis集群部署
    重磅!涵盖全微服务操作的Spring Cloud 文档竟出自Alibaba
  • 原文地址:https://blog.csdn.net/LionHearthz/article/details/126329692