gpt4 book ai didi

java - 来自 javax.validation.constraints 的注释与自定义 ConstraintValidator 相结合

转载 作者:行者123 更新时间:2023-11-30 08:39:38 24 4
gpt4 key购买 nike

我在将 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 {};
}

对于自定义 validator :

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

当现在验证一个 Person 对象并且年龄为空时,我在 PersonValidator 中得到一个 Nullpointer 异常。我想,这是由 javax Annoation @NotNull 检查的东西。是否有将注释与自定义 validator 相结合的解决方案,还是我必须自己检查 validator 中的空值?

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

最佳答案

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

关于java - 来自 javax.validation.constraints 的注释与自定义 ConstraintValidator 相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36060593/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com