【问题标题】: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()));
    
    
            }
    
        }
    

    【讨论】:

    • linked answer 似乎提供了正确答案,您可以继续将此问题标记为重复
    猜你喜欢
    • 2014-08-30
    • 2019-01-07
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 2017-11-22
    相关资源
    最近更新 更多