8

私はGWT2.4を使用してプロジェクトを開発しており、ドメインクラス(サーバー側)からアノテーションを再作成せずにクライアント(プロキシ)クラスを検証(JSR 303)する方法を探しています。GWTトランクコード(検証)で提供される例があることは知っていますが、RequestFactoryを使用せず、RPCを使用します。

クライアント側のドメインクラスから検証を行うことは可能ですか?ドメインモデルをクライアントコードと共有するのが最善の戦略でしょうか?

私の知る限り、GWTチームは2.3と2.4でこの機能に取り組んでいました。すでに完了していますか、それともGWT 2.5を待つ必要がありますか?

これはすでにGWTフォーラムに投稿されていますが、まだ回答がありません。

https://groups.google.com/forum/#!msg/google-web-toolkit/au_GCy_9WZQ/6296p5TcWdoJ

ありがとう。

編集:これは、クライアント側での検証方法です(テストされていません)...

@UiHandler("save")
void onSave(ClickEvent event) {
    Modulo modulo = new Modulo(); //domain class
    Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
    Set<ConstraintViolation<Modulo>> violations = validator.validate(modulo, Default.class);
    delegate.saveClicked();
}
4

2 に答える 2

4

私が見つけた最良の選択肢は待つことです。GWTチームはまだクライアント側の検証に取り組んでおり、夏の終わりが予定されています。

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

プロジェクトメンバーncha...@ google.comによるコメント、2012年4月10日:

「今年の夏に仕様の実装を終了する予定です。」

このアプリケーションには多くの入力データがないため、サーバー上でのみ検証を行うことを選択しました。

于 2012-05-14T19:47:24.823 に答える
4

クライアントとサーバーでRequestFactoryを使用して同じ検証アノテーションを使用するための(一時的な)ソリューションを見つけました。

JSR 303アノテーションを、プロキシ・インターフェース(クライアント)とドメイン・クラス(サーバー)の両方によって実装される別個のインターフェースに配置します。もちろん、このインターフェースは共有パッケージに含まれている必要があります。

検証アノテーションは継承階層に自動的に渡されるため、検証はサーバーだけでなくクライアントでも機能するはずです。

ユーザーが登録しようとしたときに使用されるオブジェクトの例を次に示します。

UserProxyValidJSR303検証アノテーションを含む共通インターフェースです。

public interface UserProxyValid  {

  @NotBlank(
      groups = {ClientGroup.class, ServerGroup.class})
  @UniqueEmail(
      groups = {ServerGroup.class})
  String getEmail();

  @NotBlank(
      groups = {ClientGroup.class, ServerGroup.class})
  @Size(
      min = 4, max = 25,
      groups = {ClientGroup.class, ServerGroup.class})
  String getPassword();
}

Userサーバー上のドメインクラスです。

public class User implements UserProxyValid {

  private String email;
  private String password;

  public String getEmail() {
    return email;
  }

  public void setEmail(String email) {
    this.email = email;
  }

  public String getPassword() {
    return password;
  }

  public void setPassword(String password) {
    this.password = password;
  }
}

そして最後にUserProxy、クライアントのために:

@ProxyFor(value = User.class)
public interface UserProxy extends ValueProxy, UserProxyValid {

  String getEmail();
  void setEmail(String email);

  String getPassword();
  void setPassword(String password);
}

グループ

グループを使用すると、個々の検証がクライアントまたはサーバーのみ、あるいはその両方で行われることを確認できます。(上記の例のように、電子メールの一意性の検証はサーバー上でのみ実行できます。)

これは、クライアント上のオブジェクトを検証する方法です。

Validator clientValidator = Validation.buildDefaultValidatorFactory().getValidator();
    Set<ConstraintViolation<UserProxy>> violations = clientValidator.validate(userProxy, ClientGroup.class);

そして、これがサーバー上で検証が行われる方法です。

Validator serverValidator = Validation.buildDefaultValidatorFactory().getValidator();
    Set<ConstraintViolation<User>> violations = serverValidator.validate(user, ServerGroup.class);

未来への希望

もちろん、追加UserProxyValidのクラスがない方が良いでしょう。そのため、GoogleがBeanValidationのアップデートを提供するとすぐに、そのクラスを削除してアノテーションをドメインクラスに移動できる可能性があります。

于 2012-05-18T21:14:05.627 に答える