我有一个问题是将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检查的东西。 有没有将注释与自定义验证器结合使用的解决方案,还是我必须自己检查验证器中的空值?
(代码只是一个例子 - 但这是一个普遍的问题)
答案 0 :(得分:2)
除非您正在使用组和组序列,否则不会保证评估约束的顺序。您不能依赖@NotNull
已经发生的自定义约束。即使它,你仍然会得到一个NullPointerException
。默认情况下,Bean验证将在第一个约束违规后停止,但会收集所有必需验证的违规(因此会返回一组ConstraintViolation
。因此,age
实际上可能存在约束违规,但在您的自定义ConstraintValidator
中,您仍然会访问null
值。在此阶段,您无法绕过null
检查。