为标准 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 及其各自的包装器
这里有两种选择,您可以为 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();
}
我想知道是否可以将某些自定义类型的新约束验证器注册到 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 及其各自的包装器
这里有两种选择,您可以为 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();
}