【问题标题】:javaee bean validation @NotNull not inheritable [duplicate]javaee bean验证@NotNull不可继承[重复]
【发布时间】:2019-06-10 14:30:03
【问题描述】:
我将这个功能接口定义为:
@java.lang.FunctionalInterface
interface Foo
{
@javax.validation.constraints.NotNull Bar getBar()
}
这里的问题是覆盖getBar() 的子类型(lambdas,...)似乎不受不可为空约束。
对此有什么切实可行的解决方案?
【问题讨论】:
标签:
java
jakarta-ee
bean-validation
【解决方案1】:
请准确,因为您的观察与接受的答案 here 直接冲突。 似乎不受约束不是很精确,要么是,要么不是。
javax.validation.constraints.@NotNull 是一个 JSR 验证,因此它应该包含在上面的答案中。如果没有,您可能会尝试在该答案中发表评论。
我建议发布您的驱动程序/设置,因为我怀疑 jsr bean 验证器可能不会在您的实例化中被调用。
您应该了解,上面答案中列出的这种特殊行为非常特定于 bean 验证注释处理器,并且与 Java 中的通用注释继承无关。
只是题外话,但试图包含这些答案以理解 Java 中的注解继承,
Answer -1
Answer -2
Answer -3
Answer -4 Spring MVC Validations
只是为了说明,直到行 - Bar bar = foo.getBar(); 之前没有错误消息,但是当我通过验证器时,我收到消息 - bar- may not be null 对于父母和孩子,
@java.lang.FunctionalInterface
public interface FooChild extends Foo {
}
和驱动程序,
import java.util.Set;
import javax.validation.Configuration;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
public class DriverProgram {
public static void main(String[] args) {
Foo foo = () -> {
return null;
};
Bar bar = foo.getBar();
Configuration<?> config = Validation.byDefaultProvider().configure();
ValidatorFactory factory = config.buildValidatorFactory();
Validator validator = factory.getValidator();
factory.close();
Set<ConstraintViolation<Foo>> violations = validator.validate(foo);
violations.forEach(v -> System.out.println(v.getPropertyPath() + "- " + v.getMessage()));
FooChild fooChild = () -> {
return null;
};
bar = fooChild.getBar();
violations = validator.validate(fooChild);
violations.forEach(v -> System.out.println(v.getPropertyPath() + "- " + v.getMessage()));
}
}