如何让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
相关产品推荐
相关产品推荐

