【问题标题】:How do I manually invoke the Java Validation API?如何手动调用 Java Validation API?
【发布时间】:2014-05-07 07:12:52
【问题描述】:

在java中什么时候使用注解有什么细节,或者更准确地说,是下面问题的答案是或否

只有在这种条件下,才能使用这种特殊的注解。

显然,上述语句中的 this 可以是任何东西,也可以什么都不是。

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

我尝试了以下代码。 (这只是普通的java代码,没有spring什么的。这是整个代码)

public class AnnotationsTest {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        TestMe t = new TestMe();
        System.out.println(t.getTest1());

    }

}

class TestMe{
    @NotNull
    private String test1;

    public String getTest1() {
        return test1;
    }

    public void setTest1(String test1) {
        this.test1 = test1;
    }
}

这个打印出 null 作为输出。为什么没有进行任何验证?

嗯,我猜我已经为此提供了注释,但还没有真正验证。所以我去了this link。其中他有各种各样的ValidationFactory 等等。

所以我写了,

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)

所以这是我的问题: 1、以上两种情况到底发生了什么? 2. 我认为注释就足够了,就像Autowired 之类的东西,他们只会自己注入类。但是在这里为什么我需要做额外的事情来验证。为什么@NotNull 不自己验证这些东西。

谢谢。

【问题讨论】:

  • javax.validation... 只是一个 API。你还需要一个像 Hibernate-Validator 这样的实现。这应该可以解决未找到的问题。

标签: java spring hibernate validation annotations


【解决方案1】:

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

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

因此,在您的情况下,尽管元数据以注释的形式存在于类中,但是没有实际处理它们的代码。在验证的情况下,该代码将是 Hibernate Validator。

要使用 Hibernate Validator,您可以查看 this 链接

【讨论】:

  • 哦,所以即使我得到了规范的实现,即 Hibernate Validator,第一段代码也不能正常工作吗?它仍然会打印 null 并且不会真正验证。
  • 没错!您需要在您的应用程序中注册 Hibernate Validator 并使其运行验证。 Hibernate Validator 所做的实际上是处理验证的具体细节。你是真正必须告诉它让它做所有事情的人(在独立环境中,在 Spring 环境中,Spring 可以为你调用验证)
  • 很抱歉,但我想我仍然不确定第二个代码有什么问题?我只是从给出的链接中获取的?而且我不确定为什么它不起作用
  • 您确定 Hibernate Validator 在您的类路径中吗?
  • 但是,是的,为什么需要这样做。最初我认为 Validation 是一个接口,而 Hibernate Validator 可能是它所需的实现。但是现在我看到 Validation 是一个类,如果我在它上面调用一个方法,它应该获取我的验证器,对吗?
猜你喜欢
  • 2013-10-12
  • 2014-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多