2012-01-26 11 views
3

GWT 2.4でHibernate Validatorを使用する際に問題があります。モジュールが起動されたとき、私はエラーを取得: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を持っていたJSR303標準に基づいてGWT検証フレームワークを自分で実装することを決めました。

とにかく、これはウィキで述べたように、まだ実験的なフレームワークです:

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

WARNING 実験。 APIが変更されることがあります。いくつかのことはまだ機能しません。

私があなただったら、それを機能させようとはしません。自分のクラスを検証する能力のあるジェネレータを実装します。

は、私もここでこのフレームワークを試してみました:

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

...しかし、再び、全くそれは私のために動作させるために失敗しました!しかし、あなたのケースに応じて、うまくいくかもしれません... "非常に"小さなアプリケーションを作り、さまざまなアプローチをテストし、あなたのために何が効果的かを見てみましょう。

関連する問題