如何实现实体类字段仅指定数值可通过的校验逻辑
实现方案
本文方案基于Java Bean Validation规范(Spring Boot项目默认集成支持),提供两种实现方式:
方案1:使用内置@Pattern注解(最简单,无需额外写代码)
直接用正则匹配限制允许的取值,修改实体类字段注解即可:
@NotNull @Pattern(regexp = "^(2|5|7|11|18)$", message = "version仅允许取值为2、5、7、11、18") @Column(name = "version") private String version;
方案2:自定义校验注解(可扩展性更高,适合后续要频繁修改允许值的场景)
第一步:新建自定义校验注解
import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*; @Target({ElementType.FIELD, ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = VersionValidator.class) public @interface AllowedVersion { String message() default "version仅允许取值为2、5、7、11、18"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
第二步:实现校验逻辑类
import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import java.util.Arrays; import java.util.List; public class VersionValidator implements ConstraintValidator<AllowedVersion, String> { private static final List<String> ALLOWED_VERSIONS = Arrays.asList("2", "5", "7", "11", "18"); @Override public boolean isValid(String value, ConstraintValidatorContext context) { // 非空校验由原有@NotNull负责,空值直接跳过当前校验 if (value == null) { return true; } return ALLOWED_VERSIONS.contains(value); } }
第三步:给实体类字段加注解
@NotNull @AllowedVersion @Column(name = "version") private String version;
注意:如果你使用的是Spring Boot 3+版本,将上述代码中所有
javax.validation包路径替换为jakarta.validation即可正常使用。
内容的提问来源于stack exchange,提问作者Mary
相关产品推荐
相关产品推荐

