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

如何使用@Digits注解实现1.1.1格式版本号的校验?

问题原因

你当前使用的@DecimalMin、@Digits均为数值类型校验注解,仅支持校验只有一个小数点的标准小数格式。而1.1.1这类三段式版本号包含两个小数点,不属于合法小数,因此原有注解无法匹配你的校验需求。

解决方案

方案1:使用@Pattern正则校验(最简实现)

如果你的版本号规则固定为每段1位数字、总共3段的x.x.x格式,直接添加正则校验注解即可:

@NotBlank(message = "版本号不能为空")
@Pattern(regexp = "^\\d\\.\\d\\.\\d$", message = "unsupported number of digits for version.")
private String messageVersion;

如果需要适配更灵活的规则,可以调整正则:

  • 允许每段为多位数字:^\\d+\\.\\d+\\.\\d+$
  • 允许2~4段版本号:^\\d+(\\.\\d+){1,3}$

方案2:自定义校验注解(适配复杂逻辑)

如果需要额外校验每段数值的最大值、或者后续要扩展校验规则,推荐自定义校验注解:

  1. 定义自定义校验注解
import javax.validation.*;
import java.lang.annotation.*;

@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = VersionValidator.class)
public @interface ValidVersion {
    String message() default "版本号格式错误";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
    // 可配置每段允许的最大数值
    int maxSegmentValue() default 9;
    // 可配置允许的版本段数
    int allowedSegmentCount() default 3;
}
  1. 编写校验逻辑实现类
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class VersionValidator implements ConstraintValidator<ValidVersion, String> {
    private int maxSegmentValue;
    private int allowedSegmentCount;

    @Override
    public void initialize(ValidVersion constraintAnnotation) {
        this.maxSegmentValue = constraintAnnotation.maxSegmentValue();
        this.allowedSegmentCount = constraintAnnotation.allowedSegmentCount();
    }

    @Override
    public boolean isValid(String version, ConstraintValidatorContext context) {
        // 空值交由@NotBlank校验,此处直接放行
        if (version == null || version.isBlank()) {
            return true;
        }
        String[] segments = version.split("\\.");
        // 校验段数是否符合要求
        if (segments.length != allowedSegmentCount) {
            return false;
        }
        // 校验每段为数字且不超过最大值
        for (String seg : segments) {
            if (!seg.matches("\\d+")) {
                return false;
            }
            int segNum = Integer.parseInt(seg);
            if (segNum > maxSegmentValue) {
                return false;
            }
        }
        return true;
    }
}
  1. 在字段上使用自定义注解
@NotBlank
@ValidVersion(maxSegmentValue = 9, allowedSegmentCount = 3, message = "unsupported number of digits for version.")
private String messageVersion;

内容的提问来源于stack exchange,提问作者Danidu Wijendra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:54:03