后端校验JSR303

目录

一、导入依赖

二、实现步骤

三、分组校验

四、自定义校验


一、导入依赖

        
            javax.validation
            validation-api
            2.0.1.Final
        

二、实现步骤

1、给实体类对应的属性添加注解:javax.validation.constraints,并定义自己的message提示,如下所示:

/**
 * 品牌名
 */
@NotBlank(message = "品牌名不能为空")
private String name;

2、开启校验功能@Valid,校验错误以后会有默认的响应,但是以上面的message优先

  /**
   * 保存
   */
  @RequestMapping("/save")
  //@RequiresPermissions("product:brand:save")
  public R save(@Valid @RequestBody BrandEntity brand){
      brandService.save(brand);
​
      return R.ok();
  }

3、给校验的Bean后紧跟一个BindingResult,就可以获取到校验的结果

  /**
   * 保存
   */
  @RequestMapping("/save")
  //@RequiresPermissions("product:brand:save")
  public R save(@Valid @RequestBody BrandEntity brand, BindingResult Result){
      brandService.save(brand);
​
      return R.ok();
  }

三、分组校验

1、分组校验(多场景的复杂校验),当新增和更新校验的字段个数不一样时,可以采用分组,首先给属性上注解后面添加分组,标注什么情况需要进行校验

先添加两个接口,不需要实现什么

public interface AddGroup {
}
public interface UpdateGroup {
}

属性上标注类型

/**
 * 品牌id
 */
@NotNull(message = "修改必须指定品牌id", groups = UpdateGroup.class)
@Null(message = "新增不能指定id", groups = AddGroup.class)
@TableId
private Long brandId;

然后是方法上改为validated注解,可以添加分组类型

    /**
     * 保存
     */
    @RequestMapping("/save")
    public R save(@Validated(AddGroup.class) @RequestBody BrandEntity brand){
            brandService.save(brand);
​
        return R.ok();
    }
    
    /**
     * 修改
     */
    @RequestMapping("/update")
    //@RequiresPermissions("product:brand:update")
    public R update(@Validated(UpdateGroup.class) @RequestBody BrandEntity brand){
        brandService.updateById(brand);
​
        return R.ok();
    }

注意,默认没有指定分组的分组注解是不生效的,比如@Validated(AddGroup.class)只有标注了AddGroup分组的才会校验,没有指定分组的只会在@Validated,也就是没指定分组才会校验

四、自定义校验

1、编写一个自定义校验注解

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = { ListValueConstraintValidator.class}) //这里可以放置多个校验器,我们只写了对integer的校验,还可以写别的类型,springboot会自动匹配对应的校验器
public @interface ListValue {
    String message() default "{com.atguigu.common.valid.ListValue.message}";
​
    Class[] groups() default {};
​
    Class[] payload() default {};
​
    int[] vals() default {};
}
​
​

2、编写一个自定义校验器

public class ListValueConstraintValidator implements ConstraintValidator {
    private Set set = new HashSet<>();
​
    // 初始化方法
    @Override
    public void initialize(ListValue constraintAnnotation) {
        int[] vals = constraintAnnotation.vals();
        for(int val: vals) {
            set.add(val);
        }
    }
​
    /*
     * @Description
     * @Author zoe
     * @Date 2023/7/13 16:52
     * @Param integer就是要进行校验的值
     **/
    @Override
    public boolean isValid(Integer integer, ConstraintValidatorContext constraintValidatorContext) {
        return set.contains(integer);
    }
}

3、关联自定义校验注解和自定义校验器

@Constraint(validatedBy = { ListValueConstraintValidator.class}) //这里可以放置多个校验器,我们只写了对integer的校验,还可以写别的类型,springboot会自动匹配对应的校验器
public @interface ListValue

4、属性上面标注该注解


    /**
     * 显示状态[0-不显示;1-显示]
     */
    @ListValue(vals = {0, 1}, groups = AddGroup.class)
    private Integer showStatus;

你可能感兴趣的:(gulimall,学习笔记,java,spring,boot,spring,后端)