GWT и Hibernate Validator - PullRequest
       9

GWT и Hibernate Validator

3 голосов
/ 26 января 2012

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

00: 00: 05,562 [ОШИБКА] Отложенный тип результата привязки 'javax.validation.ValidatorFactory' не должен быть абстрактным

java.lang.RuntimeException: Отложенная привязка завершилась неудачно для javax.validation.ValidatorFactory (вы забыли унаследовать необходимый модуль?) ...

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

<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>

Ответы [ 2 ]

4 голосов
/ 26 января 2012

РЕШЕНО!
Согласно 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
    }
    ...
}
1 голос
/ 26 января 2012

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

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

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

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

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

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

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

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

...