1.自定义注解State
package com.itheima.anno;
import com.itheima.Validator.StateValidator;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.*;
@Documented//元注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {StateValidator.class})//提供校验规则的类
public @interface State {
//提供校验失败后的信息
String message() default "state参数的值只能是已发布或者草稿";
//指定分组
Class<?>[] groups() default {};
//负载 获取到State注解的附加信息
Class<? extends Payload>[] payload() default {};
}
2.自定义校验数据的类StateValidation实现ConstraintValidator接口
package com.itheima.Validator;
import com.itheima.anno.State;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
//参数1:给哪个注解提供校验规则 参数2:校验的数据类型
public class StateValidator 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;
}
}
3.在需要校验的地方使用自定义注解(在state上方添加自定义注解@State,只能是”已发布“||"草稿"状态)
package com.itheima.pojo;
import com.itheima.anno.State;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import lombok.Data;
import org.hibernate.validator.constraints.URL;
import java.time.LocalDateTime;
@Data
public class Article {
private Integer id;//主键ID
@Pattern(regexp = "^\\S{1,10}$")
@NotEmpty
private String title;//文章标题
@NotEmpty
private String content;//文章内容
@NotEmpty
@URL
private String coverImg;//封面图像
@State
private String state;//发布状态 已发布|草稿
@NotNull
private Integer categoryId;//文章分类id
private Integer createUser;//创建人ID
private LocalDateTime createTime;//创建时间
private LocalDateTime updateTime;//更新时间
}
用postMan测试这个
如果state不写或者写的不是草稿或者已发布,则会报错。