Validated的分组校验和自定义校验注解

1. Validated的分组校验     

1.1 简介

        Validated的分组校验是指根据不同的校验规则对同一个实体类进行不同的校验。这在实际开发中非常常见,比如在新增和更新操作中,可能有不同的校验规则。

1.2 使用方法

        在实体类中,我们可以利用javax.validation.constraints包下的注解来定义不同的校验规则,并使用分组校验的方式来指定在不同的场景下使用哪些校验规则。

举例子:我的代码添加的时候,是使用mysql的主键自动生成策略不需要传入主键,但修改的时候需要,他们又需要相同的javabean对象,如果没有分组校验,难道我需要再创一个javabean还是传入的是否手动使用if判断,显然和下述对比,这两种都很麻烦。

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Category {
    @NotNull(groups = Update.class)//因为新增不需要,修改需要,可以设置分组校验
    private Integer id;//文章分类id
    @NotEmpty
    private String categoryName;//文章分类名称
    @NotEmpty
    private String categoryAlias;//文章分类别名
    private Integer createUser;//创建人id
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")//添加日期格式
    private LocalDateTime createTime;//创建时间
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;//修改时间

    //设置分组校验
    public interface Add extends Default{

    }
    public interface Update extends Default {

    }
}

        在上面的例子中,我们定义了一个Category实体类,并使用@NotNull@NotBlank等注解来定义校验规则,并通过groups属性来指定在不同的分组下生效。 

1.3 在Controller中使用分组校验

在Controller中,我们可以利用@Validated注解来指定需要校验的分组,并通过BindingResult来获取校验结果。

/**
 * 更新文章分类
 * @param category 解析前端提交的json封装的javabean
 * @return 是否修改成功
 */
@PutMapping
public Result updateCategory(@RequestBody @Validated(Category.Update.class) Category category){
    categoryService.updateCategory(category);
    return Result.success();
}
/**
 * 新增文章分类
 * @param category 文章分类的javabean,自动解析前端提交的json数据并进行封装
 * @return 是否添加成功
 */
@PostMapping
public Result addCategory(@RequestBody @Validated(Category.Add.class) Category category){
    categoryService.addCategory(category);
    return Result.success();
}

2. 自定义校验注解 

2.1 简介

        除了使用内置的校验注解外,我们还可以自定义校验注解来满足特定的校验需求。自定义校验注解通常需要定义一个注解接口,并编写对应的校验器。

2.2 使用方法

首先,我们定义一个自定义的校验注解@State:作用是标记该属性为枚举类型,只能含有两种状态,其他的状态报错。

/**
 * @Description: Validated自定义参数校验的注解
 * @Author: windStop
 * @Date: 2024/5/28 15:29
 */
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {StateValidation.class})//谁来提供校验规则
public @interface State {
    //提供校验失败后的提示信息
    String message() default "{state的值只能是已发布或者是草稿}";

    //指定分组
    Class<?>[] groups() default {};

    //负载 , 可以获取附加信息
    Class<? extends Payload>[] payload() default {};
}

然后编写对应的校验器 StateValidation 并实现 ConstraintValidator<State,String>约束校验器接口

泛型一:给哪个注解提供校验规则
泛型二:校验的数据类型

/**
 * @Description: 提供自定义校验规则的类
 * @Author: windStop
 * @Date: 2024/5/28 15:33
 * ConstraintValidator<State,String>   参数一: 给哪个注解提供校验规则  参数二:校验的数据类型
 */
public class StateValidation implements ConstraintValidator<State,String> {
    /**
     * 判断被@State标记的字段是否符合要求
     * @param s 待校验的值
     * @param constraintValidatorContext 在校验过程中进行一些上下文相关的操作
     * @return 是否符合要求
     */
    @Override
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        //提供校验规则
        if (s == null) return false;
        return s.equals("已发布") || s.equals("草稿");
    }
}
最后,在实体类中使用自定义的校验注解直接在属性中使用@State即可

通过以上的步骤,我们可以轻松地在Spring Boot项目中使用Validated的分组校验和自定义校验注解,实现灵活且强大的数据校验功能。

希望本文对你有所帮助,祝你在项目中顺利应用数据校验功能!

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风止￴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值