【问题标题】:Using javax.validation in GWT throws runtime error ClassNotFoundException在 GWT 中使用 javax.validation 会引发运行时错误 ClassNotFoundException
【发布时间】:2012-03-21 20:35:32
【问题描述】:

我在 GWT 应用程序中使用 javax.validation.* 我将依赖项添加到我的 pom 中:

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>1.0.0.GA</version>
</dependency>

但在运行时我得到 ClassNotFoundException :

2012-03-20 09:46:12,253 WARN [pool-2-thread-1] o.s.c.t.c.AnnotationAttributesReadingVisitor [AnnotationAttributesReadingVisitor.java:91] 读取注释元数据时无法加载类型。这是一个非致命错误,但某些注释元数据可能不可用。 java.lang.ClassNotFoundException: javax.validation.constraints.NotNull 在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1701) ~[catalina.jar:7.0.26] 在 org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1546) ~[catalina.jar:7.0.26] 在

有什么想法吗?

【问题讨论】:

  • 调用 mvn help:effective-pom 并检查validation-api是否在。

标签: java validation gwt


【解决方案1】:

实际上,验证框架需要做几件事。

您需要验证 API。 似乎你有,但你必须记住,GWT 需要包含文件的

为了使其正常工作,您需要同时包含 API jar 和 API 源。

<dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>1.0.0.GA</version>
        <type>jar</type>
        <classifier>sources</classifier>
</dependency>
<dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>1.0.0.GA</version>
        <type>jar</type>
</dependency>

如果没有这个,您将获得验证 API 的类未找到异常。

您还需要确保已将验证包含添加到您的 GWT 模块 XML。

<inherits name="org.hibernate.validator.HibernateValidator" />
<replace-with
    class="com.google.gwt.sample.validation.client.SampleValidatorFactory">
    <when-type-is class="javax.validation.ValidatorFactory" />
</replace-with>

此外,您还需要包含某种验证引擎。如果您遵循 GWT bean 验证指南,您可能需要休眠验证。

要验证带注释的对象,您应该使用提供的 API。

import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import javax.validation.ConstraintViolation;

/* ... snip ... */

//get validator factory using default bootstrap mechanism of the Validation library
ValidatorFactory factory = Validation.byDefaultProvider().configure().buildValidatorFactory();

//get a validator instance
Validator validator = factory.getValidator();

//create new object
Person person = new Person();
person.setFirstName("Andrew");

//validate person object
Set<ConstraintViolation<Person>> violations = validator.validate(person);

//should be one violation from lastName being null
assert violations.size() == 1;

祝你好运。

【讨论】:

  • 谢谢!这似乎是正确的方法。但我想知道——我们实际上(目前)只想要 javax.validation 的简单功能——特别是 Nullable 和 NotNull,还没有使用完整的验证机制。这仍然是正确的方法(使用休眠验证器)吗?此外 - 我想我不确定这些验证究竟是如何工作的 - 我会得到编译错误吗?运行时错误?我应该显式调用一些验证器吗...?
  • 我将把它留在这里:code.google.com/p/gwt-validation。但是,严肃地说,任何一个工具包都可以工作。验证引擎通过扫描给定类上的注释然后使用它来运行引擎来工作。此处看到的相同验证代码:code.google.com/p/gwt-validation/wiki/GWT_Validation_2_0 应该让您走上正确的道路。我已经更新了我的帖子以包含源代码示例。
【解决方案2】:

您必须添加一个带有验证实现的 jar,例如我们的 hibernate-validation。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-03
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多