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

时间:2017-12-05 17:08:21

标签: java bean-validation hibernate-validator

我想知道是否可以将一些自定义类型的新约束验证器注册到由Bean Validation规范定义的注释。 例如,让我们的图像有一个积累了几个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;

2 个答案:

答案 0 :(得分:4)

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

如果需要,请参阅此post(“使用非标准类的标准约束”部分)

答案 1 :(得分:0)

无法在IntContainer类上使用@Positive批注,因为验证程序不支持此数据类型。

@Positive注释支持的类型是:

  • BigDecimal
  • 的BigInteger
  • byte,short,int,long,float,double及其各自的包装器

请参阅Annotation Type Positive

这里有两个选项,您可以为IntContainer编写自己的自定义验证器,或者您可以从具有成员变量的实体获取IntContainer然后验证它。如:

豆:     公共类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();
}