参数校验时,我们希望不同的方法参数校验规则不同,这时就需要分组校验。
public class Category {
@NotNull(groups = Update.class)
private Integer id;//主键ID
@NotEmpty
private String categoryName;//分类名称
// @NotEmpty(groups = {Add.class, Update.class})
@NotEmpty
private String categoryAlias;//分类别名
private Integer createUser;//创建人ID
@JsonFormat(pattern = "yyyy-MM-dd MM:mm:ss")
private LocalDateTime createTime;//创建时间
@JsonFormat(pattern = "yyyy-MM-dd MM:mm:ss")
private LocalDateTime updateTime;//更新时间
public interface Add extends Default {
}
public interface Update extends Default {
}
}
@PostMapping
public Result add(@RequestBody @Validated(Category.Add.class) Category category) {
categoryService.add(category);
return Result.success();
}
@PutMapping
public Result update(@RequestBody @Validated(Category.Update.class) Category category) {
categoryService.update(category);
return Result.success();
}
package com.heo.anno;
import com.heo.validation.StateValidation;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Documented // 元注解 抽取 State 到帮助文档内
@Constraint(
validatedBy = {StateValidation.class} // 指定校验规则的类
)
@Target({FIELD}) // 元注解 表明注解使用的场合 FIELD 表示 使用在属性上
@Retention(RUNTIME) // 元注解 注解在哪个阶段会被保留
public @interface State {
// 提供校验失败后的提示信息
String message() default "state参数的值只能是已发布或者草稿";
// 指定分组
Class<?>[] groups() default {};
// 负载 注解的附加信息
Class<? extends Payload>[] payload() default {};
}
package com.heo.validation;
import com.heo.anno.State;
import jakarta.validation.Constraint;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
/**
* 自定义接口的校验规则类
* State 给哪个注解提供校验规则
* String 校验的数据类型
*/
public class StateValidation implements ConstraintValidator<State, String> {
/**
*
* @param s 将来要校验的数据
* @param constraintValidatorContext
* @return 返回 false 校验不通过,true 则通过
*/
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
// 提供校验规则
if (s == null) {
return false;
}
if (s.equals("已发布") || s.equals("草稿")) {
return true;
}
return false;
}
}