如何在Java中创建一个验证器来检查一个整数是否在一个特定的提供值列表中

bjg7j2ky  于 2023-04-28  发布在  Java
关注(0)|答案(1)|浏览(144)

我需要使用javax。valitation为整数字段创建验证器。该整数字段必须是所提供的值列表中的值(i.即5、10或15)以通过验证。
特别是,我的领域是:

@IntegerValueAmong({5, 10, 15})
private Integer myNumber;

IntegerValueAmong注解定义为:

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = IntegerValueAmongValidator.class)
public @interface IntegerValueAmong {
  String message() default "Value must an integer value among";
  Class<?>[] groups() default {};
  Class<? extends Payload>[] payload() default {};
  int[] value() default {};
}

我尝试做的IntegerValueAmongValidator是:

public class IntegerValueAmongValidator implements ConstraintValidator<IntegerValueAmong, Integer> {
  @Override
  public boolean isValid(Integer integer, ConstraintValidatorContext constraintValidatorContext) {
      return integer == 5 || integer == 10 || integer == 15;
  }
}

但我不想有5,10和15作为硬编码值,我想访问传递到字段上的IntegerValueAmong注解的数组。

dpiehjr4

dpiehjr41#

您提出这个问题的事实表明您在阅读文档时没有付出太多的努力。如果你会,你会注意到initialize方法。此方法在调用isValid之前被调用,并接收当前注解。这样,您就可以为特定的注解配置验证器。

public class IntegerValueAmongValidator implements ConstraintValidator<IntegerValueAmong, Integer> {

  private List<Integer> allowedValues = Collections.emptyList();

  @Overide
  public void initialize(IntegerValueAmong annot) {
    allowedValues =  IntStream.of(annot.value()).boxed().collect(Collectors.toList());
  }

  @Override
  public boolean isValid(Integer integer, ConstraintValidatorContext constraintValidatorContext) {
    return integer != null && allowedValues.contains(integer);
  }
}

相关问题