Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何手动调用Java验证API?_Java_Spring_Hibernate_Validation_Annotations - Fatal编程技术网

如何手动调用Java验证API?

如何手动调用Java验证API?,java,spring,hibernate,validation,annotations,Java,Spring,Hibernate,Validation,Annotations,关于什么时候在java中使用注释,或者更准确地说,有什么细节吗?下面的问题的答案是肯定的还是否定的 只有在此条件下,才能使用此特定注释 显然,上述语句中的this可以是任何内容,也可以是零 我问这个问题的原因是,我得到了这个代码库,在他们的代码库中,他们使用了一些注释来验证类、属性等。现在,这是一个web应用程序,它使用了所有的Springbean等等 我尝试了以下代码。(这只是普通的java代码,没有spring或任何东西。这是全部代码) 这一个输出为null。为什么没有进行任何验证 嗯,我猜

关于什么时候在java中使用注释,或者更准确地说,有什么细节吗?下面的问题的答案是肯定的还是否定的

只有在条件下,才能使用此特定注释

显然,上述语句中的this可以是任何内容,也可以是零

我问这个问题的原因是,我得到了这个代码库,在他们的代码库中,他们使用了一些注释来验证类、属性等。现在,这是一个web应用程序,它使用了所有的Springbean等等

我尝试了以下代码。(这只是普通的java代码,没有spring或任何东西。这是全部代码)

这一个输出为null。为什么没有进行任何验证

嗯,我猜我已经为此提供了注释,但还没有真正验证。所以我去了。在那里,他有各种各样的验证工厂

所以我写了,

public class AnnotationsTest{

    private static Validator validator;

    public static void main(String[] args) {
    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    validator = factory.getValidator();
            TestMe t = new TestMe();

        Set<ConstraintViolation<TestMe>> constraintViolations =
                validator.validate(t);

            assertEquals(1, constraintViolations.size());
            assertEquals("may not be null", constraintViolations.iterator().next().getMessage());

    }
}
下面是我的问题: 1.上述两起案件到底发生了什么? 2.我认为注释就足够了,就像在
Autowired
之类的东西中一样,它们只需要自己注入类。但在这里,为什么我需要做额外的东西来验证。为什么不
@NotNull
自己验证这些东西


谢谢。

关于注释,您需要了解的是它们只是代码上的元数据。不多不少

为了让所有的黑魔法发生(在您的验证案例中,或者在您提到的注册到Spring容器的
@Autowired
案例中),其他一些代码需要读取类定义,检查并查看注释是否存在,如果存在,则执行一系列步骤(可能包括注册对象之类的简单事情,或者创建代理、操作字节码等更高级的事情)

因此,在您的例子中,虽然元数据以注释的形式存在于类中,但是没有实际处理它们的代码


为了使用Hibernate Validator,您可以查看link

javax。validation…只是一个API。您还需要一个类似Hibernate Validator的实现。这应该可以解决找不到的问题。哦,所以即使我得到规范的实现,即Hibernate Validator,第一段代码也不会正常工作?它仍然会打印空值你需要在你的应用程序中注册Hibernate Validator并让它运行验证。Hibernate Validator所做的实际上是处理验证的细节。你才是真正需要告诉它让它完成所有这些的人(在独立环境中,在Spring环境中,Spring可以为您调用验证)很抱歉,但我想我仍然不确定第二个代码有什么问题?我只是从给出的链接中获取了它?我不确定它为什么不工作。你确定Hibernate Validator在你的类路径上吗?但是,是的,为什么需要这样做。起初我认为验证是一个接口,Hibernate Validator可能是实现但现在我看到验证是一个类,如果我对它调用一个方法,它应该会为我获取验证程序,对吗?
public class AnnotationsTest{

    private static Validator validator;

    public static void main(String[] args) {
    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    validator = factory.getValidator();
            TestMe t = new TestMe();

        Set<ConstraintViolation<TestMe>> constraintViolations =
                validator.validate(t);

            assertEquals(1, constraintViolations.size());
            assertEquals("may not be null", constraintViolations.iterator().next().getMessage());

    }
}
Exception in thread "main" javax.validation.ValidationException: Unable to find a default provider
    at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:264)
    at javax.validation.Validation.buildDefaultValidatorFactory(Validation.java:111)
    at AnnotationsTest.main(AnnotationsTest.java:29)