GWT и Hibernate Validator
У меня проблема с использованием Hibernate Validator с GWT 2.4. Когда модуль запускается, я получаю ошибку:
00: 00: 05,562 [ERROR] Отложенный тип результата привязки '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 ответа
Решено это!
Согласно 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
}
...
}
В прошлый раз, когда я пытался сделать эту работу, у меня просто была сильная головная боль, и я решил сам внедрить платформу GWT-валидации, основанную на стандарте JSR303.
В любом случае, это все еще экспериментальная структура, как сказано в вики:
http://code.google.com/p/google-web-toolkit/wiki/BeanValidation
ПРЕДУПРЕЖДАЮЩИЙ ЭКСПЕРИМЕНТАЛЬНЫЙ. API может измениться. Некоторые вещи до сих пор просто не работают.
Так что на вашем месте я бы не стал пытаться заставить это работать. Реализуйте себе какой-нибудь генератор, способный проверять ваши классы.
Я также попробовал эту структуру здесь:
http://code.google.com/p/gwt-validation/
... но опять же, не удалось заставить его работать на меня! Но в зависимости от ваших случаев, это может работать нормально... попробуйте сделать "очень" небольшое приложение, чтобы протестировать различные подходы и посмотреть, что работает для вас.