为标准 bean 验证注释注册新的约束验证器

Register new constraint validator for standard bean validation annotation

我想知道是否可以将某些自定义类型的新约束验证器注册到 Bean 验证规范定义的注释中。 例如,假设我有一个 class 累积了几个 int 值

public class IntContainer
{
  private int value1;
  private int value2;


  public int getValue1()
  {
    return value1;
  }


  public void setValue1(final int value1)
  {
    this.value1 = value1;
  }


  public int getValue2()
  {
    return value2;
  }


  public void setValue2(final int value2)
  {
    this.value2 = value2;
  }
}

我想注册自定义约束验证器以支持此类型的@Positive 注释(而不是创建自定义注释)。

public class PositiveIntContainerValidator implements ConstraintValidator<Positive, IntContainer>
{
  @Override
  public boolean isValid(final IntContainer value, final ConstraintValidatorContext context)
  {
    //TODO: do some validation here based on IntContainer state
    return false;
  }
}

以便以后我可以使用这个:

@Positive
private IntContainer valueContainer;

可以将验证器的完全限定名称添加到 META-INF/services/javax.validation.ConstraintValidator 文件中。这将允许 Hibernate Validator 获取您的验证器并将其用于您的自定义类型。

如果需要,请参阅此 post(第 "Use standard constraints for non standard classes" 部分)

中的更多详细信息

无法在您的 IntContainer class 上使用 @Positive 注释,因为验证器不支持此数据类型。

@Positive 注释支持的类型是:

  • BigDecimal
  • 大整数
  • byte、short、int、long、float、double 及其各自的包装器

Annotation Type Positive

这里有两种选择,您可以为 IntContainer 编写自己的自定义验证器,或者您可以从具有成员变量的实体中获取 IntContainer,然后对其进行验证。如:

豆豆: public class IntContainer {

@Positive
private int value1;
@Positive
private int value2;

public IntContainer() {

}

public IntContainer(int value1, int value2) {
    this.value1 = value1;
    this.value2 = value2;
}

public int getValue1() {
    return value1;
}

public void setValue1(final int value1) {
    this.value1 = value1;
}


public int getValue2() {
    return value2;
}


public void setValue2(final int value2) {
    this.value2 = value2;
}

}

休息:

@POST
public Response postTest(TestRest testRest) {
    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    Validator validator = factory.getValidator();

    Set<ConstraintViolation<IntContainer>> constraintViolations = validator.validate(testRest.getIntContainer());
    System.out.println(constraintViolations.size());

    return Response.status(Response.Status.OK).entity(constraintViolations.size()).build();
}