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的分组校验和自定义校验注解,实现灵活且强大的数据校验功能。
希望本文对你有所帮助,祝你在项目中顺利应用数据校验功能!