我将此功能接口(interface)定义为:
@java.lang.FunctionalInterface
interface Foo
{
@javax.validation.constraints.NotNull Bar getBar()
}
这里的问题是子类型(lambdas,...)覆盖 getBar()
似乎不受“不可为空”约束的约束。
对此有哪些实际解决方案?
最佳答案
请准确,因为您的观察结果与已接受的答案直接冲突here 。 似乎不受约束不是很精确,要么是,要么不是。
javax.validation.constraints.@NotNull
是一个 JSR 验证,因此它应该包含在上面的答案中。如果没有,您可能可以尝试在该答案中进行评论。
我建议发布您的驱动程序/设置,因为我怀疑 jsr bean validator 可能不会在您的实例化中被调用。
您应该明白,上面答案中列出的这种特定行为是针对 Bean 验证注释处理器的,与 Java 中的通用注释继承无关。
只是偏离主题,但试图包含这些答案来理解 Java 中的注释继承,
Answer -4 Spring MVC Validations
只是为了说明,直到行 - Bar bar = foo.getBar();
为止都没有错误消息,但是当我将其通过 validator 时,我收到消息 - 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()));
}
}
关于javaee bean 验证@NotNull 不可继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54218156/