如何使用@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:自定义校验注解(适配复杂逻辑)
如果需要额外校验每段数值的最大值、或者后续要扩展校验规则,推荐自定义校验注解:
- 定义自定义校验注解
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; }
- 编写校验逻辑实现类
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; } }
- 在字段上使用自定义注解
@NotBlank @ValidVersion(maxSegmentValue = 9, allowedSegmentCount = 3, message = "unsupported number of digits for version.") private String messageVersion;
内容的提问来源于stack exchange,提问作者Danidu Wijendra
相关产品推荐
相关产品推荐

