You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现实体类字段仅指定数值可通过的校验逻辑

实现方案

本文方案基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 00:15:03