2012-01-26 5 views
3

У меня проблема с использованием Hibernate Validator с GWT 2.4. Когда модуль начинает я получаю ошибку:GWT и Hibernate Validator

00:00:05,562 [ERROR] Deferred binding result type 'javax.validation.ValidatorFactory' should not be abstract

java.lang.RuntimeException: Deferred binding failed for 'javax.validation.ValidatorFactory' (did you forget to inherit a required module?) ...

конфигурации модуля:

<module rename-to='start'> 
    ... 
    <inherits name="com.google.gwt.validation.Validation" /> 
    <!-- with this doesn't work too 
    <inherits name="org.hibernate.validator.HibernateValidator" /> 
    --> 
    ... 
</module> 

точка входа:

public class Start implements EntryPoint { 
    public void onModuleLoad() { 

     final ValidatorFactory factory = Validation.byDefaultProvider().configure().buildValidatorFactory(); 
     ... 
    } 
} 

pom.xml

<dependency> 
    <groupId>javax.validation</groupId> 
    <artifactId>validation-api</artifactId> 
    <version>1.0.0.GA</version> 
</dependency> 
<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-validator</artifactId> 
    <version>4.2.0.Final</version> 
</dependency> 

ответ

4

РЕШЕНО это!
В соответствии с http://code.google.com/p/google-web-toolkit/wiki/BeanValidation мне пришлось реализовать пользовательский MyValidatorFactory и добавить в источник hibernate-validator источники .jar.

GWT конфигурации модуля:

<!-- hibernate validator --> 
<inherits name="org.hibernate.validator.HibernateValidator" /> 
<replace-with class="net.marioosh.gwt.client.MyValidatorFactory"> 
    <when-type-is class="javax.validation.ValidatorFactory" /> 
</replace-with> 

MyValidatorFactory

package net.marioosh.gwt.client; 

import javax.validation.Validator; 
import net.marioosh.gwt.shared.model.entities.Link; 
import com.google.gwt.core.client.GWT; 
import com.google.gwt.validation.client.AbstractGwtValidatorFactory; 
import com.google.gwt.validation.client.GwtValidation; 
import com.google.gwt.validation.client.impl.AbstractGwtValidator; 

public class MyValidatorFactory extends AbstractGwtValidatorFactory { 

    /** 
    * Only the classes listed in the {@link GwtValidation} annotation can be validated. 
    * In my example: Link.class can be validated 
    */ 
    @GwtValidation(value = { Link.class }) 
    public interface GwtValidator extends Validator { 
    } 

    @Override 
    public AbstractGwtValidator createValidator() { 
     return GWT.create(GwtValidator.class); 
    } 

} 

Hibernate источники валидатор необходимы также

<!-- local dependency --> 
<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-validator-sources</artifactId> 
    <version>4.2.0.Final</version> 
    <scope>system</scope> 
    <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/hibernate-validator-4.2.0.Final-sources.jar</systemPath> 
</dependency>  

Использование:

public void onModuleLoad() { 
    final ValidatorFactory factory = Validation.byDefaultProvider().configure().buildValidatorFactory(); 
    final Validator validator = factory.getValidator(); 
    ... 

    Link l = new Link(....); 
    Set<ConstraintViolation<Link>> violations = validator.validate(l); 

    if(!violations.isEmpty()) { 
      // validation fail 
    } else { 
      // validation success 
    } 
    ... 
} 
+0

Это работает как на стороне клиента, так и на стороне сервера? И правильно ли он интерполирует сообщения с интернационализацией? – Renato

1

Последний раз, когда я пытался сделайте эту работу, у меня просто была огромная hea dache и решил самостоятельно реализовать систему валидации GWT, основываясь на стандарте JSR303.

Во всяком случае, это все еще экспериментальная база, как указано в Wiki:

http://code.google.com/p/google-web-toolkit/wiki/BeanValidation

ПРЕДУПРЕЖДЕНИЕ ЭКСПЕРИМЕНТАЛЬНАЯ. API может измениться. НЕКОТОРЫЕ вещи все еще не работают.

Итак, если бы я был вами, я бы не попытался заставить его работать. Внедрите себе какой-нибудь генератор, который способен проверять ваши классы.

Я также попробовал эту схему здесь:

http://code.google.com/p/gwt-validation/

... но опять же, совершенно не в состоянии заставить его работать на меня! Но в зависимости от ваших случаев это может сработать ... попробуйте сделать «очень» небольшое приложение для тестирования различных подходов и посмотреть, что сработает для вас.

Смежные вопросы