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

如何让Java的javax.validation整数校验器读取注解配置的可选值列表

自定义javax.validation整数枚举校验器实现

你已定义@IntegerValueAmong注解用于限定整数字段必须属于指定数值列表,但当前校验器硬编码了校验值,以下是修改方案,让校验器动态读取注解传入的数值数组:

修改后的校验器实现

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;

public class IntegerValueAmongValidator implements ConstraintValidator<IntegerValueAmong, Integer> {

    private Set<Integer> allowedValues;
    private IntegerValueAmong constraintAnnotation;

    @Override
    public void initialize(IntegerValueAmong constraintAnnotation) {
        // 保存注解实例,后续用于获取默认消息
        this.constraintAnnotation = constraintAnnotation;
        // 将注解中传入的int数组转为Integer集合,简化存在性判断
        allowedValues = Arrays.stream(constraintAnnotation.value())
                              .boxed()
                              .collect(Collectors.toSet());
    }

    @Override
    public boolean isValid(Integer integer, ConstraintValidatorContext context) {
        // 处理字段允许为null的情况:若不允许null,可改为return integer != null && allowedValues.contains(integer)
        if (integer == null) {
            return true;
        }
        // 判断数值是否在允许列表中
        if (allowedValues.contains(integer)) {
            return true;
        }
        // 校验不通过时,自定义错误消息,显示允许的数值列表
        context.disableDefaultConstraintViolation();
        context.buildConstraintViolationWithTemplate(
            constraintAnnotation.message() + ": " + allowedValues
        ).addConstraintViolation();
        return false;
    }
}

关键说明

  • 通过initialize方法获取注解实例,从中提取value数组并转为Set,彻底避免硬编码校验值
  • null值处理逻辑可按需调整:若字段不允许为空,直接在isValid开头判断integer == null时返回false即可
  • 自定义错误消息能让使用者直观知晓合法数值范围

内容的提问来源于stack exchange,提问作者George Lords of Castle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 03:07:35