在GWT中使用javax.validation会引发运行时错误ClassNotFoundException

Ben*_*cha 4 java validation gwt

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

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>1.0.0.GA</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

但是在运行时我得到了ClassNotFoundException:

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

有任何想法吗?

Chr*_*alo 7

实际上,验证框架需要满足几项要求.

您需要验证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>
Run Code Online (Sandbox Code Playgroud)

如果没有这个,您将获得验证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>
Run Code Online (Sandbox Code Playgroud)

此外,您还需要包含某种验证引擎.如果你遵循GWT bean验证指南,你可能想要hibernate验证.

要验证带注释的对象,您应该使用提供的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;
Run Code Online (Sandbox Code Playgroud)

祝好运.