我想知道是否可以将一些自定义类型的新约束验证器注册到由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;
答案 0 :(得分:4)
可以将验证程序的完全限定名称添加到META-INF/services/javax.validation.ConstraintValidator
文件中。这将允许Hibernate Validator选择您的验证器,它将用于您的自定义类型。
如果需要,请参阅此post(“使用非标准类的标准约束”部分)
答案 1 :(得分:0)
无法在IntContainer类上使用@Positive批注,因为验证程序不支持此数据类型。
@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();
}