【问题标题】:Annotations from javax.validation.constraints in combination with custom ConstraintValidator来自 javax.validation.constraints 的注释与自定义 ConstraintValidator 相结合
【发布时间】:2016-07-03 19:17:12
【问题描述】:

我在将 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 对象并且年龄为 null 时,我在 PersonValidator 中遇到 Nullpointer 异常。我thoguht,这是由javax Annoation @NotNull 检查的东西。 是否有将注释与自定义验证器相结合的解决方案,还是我必须自己检查验证器中的空值?

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

【问题讨论】:

  • 你的意思是说,你需要控制验证的顺序对吗?
  • 是的。这是我的意图。
  • 这不是正确的答案,但为了简单起见,您可以在 PersonValidator 类本身中验证 null 检查,对吗?
  • 这是最简单的方法,是的。但我认为它不正确。这个问题必须有一个通用的解决方案。
  • 同意,我猜你应该看看group@GroupSequence ({Person.class, PersonValidator.class})更多参考:mrbool.com/knowing-the-hibernate-validator-part-2/21878

标签: java spring validation constraints bean-validation


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    相关资源
    最近更新 更多