来自javax.validation.constraints的注释与自定义ConstraintValidator的组合

时间:2016-03-17 12:29:20

标签: java spring validation constraints bean-validation

我有一个问题是将javax注释与自定义ConstraintValidators结合起来。

我有一个示例类Person,其中需要名称和年龄。

@PersonConstraint
public class Person {

     @NotNull
     private String name;
     @NotNull
     private Integer age;     
     ...
}

我还有一个额外的约束:

@Constraint(validatedBy = PersonValidator.class)
@Target(TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface PersonConstraint{

    String message() default  "...";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

对于自定义验证器:

public class PersonValidator implements ConstraintValidator<PersonConstraint, Person> {
    ...
    @Override
    public boolean isValid(Person value, ConstraintValidatorContext context) {
        if(value.getAge() < 18) 
            return false;
        ...
    }
}

当现在验证Person对象并且age为null时,我在PersonValidator中得到了Nullpointer异常。我知道,这是由javax Annoation @NotNull检查的东西。 有没有将注释与自定义验证器结合使用的解决方案,还是我必须自己检查验证器中的空值?

(代码只是一个例子 - 但这是一个普遍的问题)

1 个答案:

答案 0 :(得分:2)

除非您正在使用组和组序列,否则不会保证评估约束的顺序。您不能依赖@NotNull已经发生的自定义约束。即使它,你仍然会得到一个NullPointerException。默认情况下,Bean验证将在第一个约束违规后停止,但会收集所有必需验证的违规(因此会返回一组ConstraintViolation。因此,age实际上可能存在约束违规,但在您的自定义ConstraintValidator中,您仍然会访问null值。在此阶段,您无法绕过null检查。