10

誰かが GWT でクライアントに例外をスローすることを示すことができますか?

私のserviceasyncインターフェースでは、サービスインターフェースでもこれを行っています

void ActivateUserAccount(String ActivationCode,AsyncCallback <Boolean> Callback) throws AlreadyActivatedError;

私のserverimpl;

私は例外をスローするためにこれをやっています

public Boolean ActivateUserAccount(String ActivationCode) throws AlreadyActivatedError
    {
....
throw new AlreadyActivatedError();
}

私の例外は次の形式です。

public class AlreadyActivatedError extends Exception implements IsSerializable
{
    public AlreadyActivatedError()
    {
        super();
    }
}
4

4 に答える 4

7

すべてを明確にするために、例外がシリアライズ可能である限り、サーバーからクライアントへのチェック済み(拡張)例外Exceptionと未チェック(拡張)例外の両方をスローできます。ただし、チェック例外をスローすることをお勧めします。RuntimeException

プログラムの直接の制御外にある無効な状態 (無効なユーザー入力、データベースの問題、ネットワークの停止、ファイルの不在) を表します。

対照的に、未チェックの例外

プログラムの欠陥 (バグ) を表します。多くの場合、非プライベート メソッドに無効な引数が渡されます。

ソース

ドキュメントに記載されているように、例外をクライアントに送信するには、次の条件を満たす必要があります。

  • 拡張する必要があります(拡張することにException注意しRuntimeExceptionてください)。
  • シリアライズ可能である必要があります。つまり、実装しSerializable、引数なしのコンストラクターを持ち、すべてのフィールドをシリアル化できます。
  • インターフェイスで、例外をスローできるメソッドに宣言を*Service追加する必要があります。インターフェイスに宣言をthrows追加する必要がないことに注意してください。throws*Async

onFailure設定が完了すると、 のメソッドで例外を処理できるようになりますAsyncCallback

GWT サイトのガイドの例に基づいて、すべての部分をまとめて表示するコード:

DelistedException.java

public class DelistedException extends Exception implements Serializable {

  private String symbol;

  // Note the no-args constructor
  // It can be protected so that only subclasses could use it
  // (because if they want to be serializable too, they'll need
  // a no-args constructor that calls the superclasses' no-args constructor...)
  protected DelistedException() {
  }

  public DelistedException(String symbol) {
    this.symbol = symbol;
  }

  public String getSymbol() {
    return this.symbol;
  }
}

StockPriceService.java

@RemoteServiceRelativePath("stockPrices")
public interface StockPriceService extends RemoteService {
  StockPrice[] getPrices(String[] symbols) throws DelistedException;
}

StockPriceServiceAsync.java

public interface StockPriceServiceAsync {
  void getPrices(String[] symbols, AsyncCallback<StockPrice[]> callback);
}

クライアント側

AsyncCallback<StockPrice[]> callback = new AsyncCallback<StockPrice[]>() {
  public void onFailure(Throwable caught) {
    if (caught instanceof DelistedException) {
      // Do something with it
    } else {
      // Probably some unchecked exception,
      // show some generic error message
  }

  public void onSuccess(StockPrice[] result) {
    // Success!
  }
};

stockPriceService.getPrices(symbols, callback);
于 2014-10-23T16:49:30.247 に答える
0

GWTは、 RuntimeExceptionから拡張されたシリアル化されていない未チェックの例外(サーバーからクライアントに送信されることを意味します)のみを処理できます。何だかわかりません。RuntimeException でない場合は、クライアント (ブラウザ) に送信できません。AlreadyActivatedError

于 2011-01-28T10:57:12.263 に答える
0

また、特定の Exception に標準コンストラクターがない場合は、例外を逆シリアル化できないため、一般的な 500 エラー メッセージも表示されることに注意してください。悲しいことに、gwt コンパイラと dev-mode プラグインは、常にこの問題を明示的に指摘するとは限りません.. (それがとにかくここにたどり着いた方法です)

したがって、vinnyjames が言ったこと (例外は Serializable であり、(RPC) サービスのインターフェイスで定義する必要があります) と組み合わせて、gwt クライアント コードでの例外の処理はそれほど複雑ではないことがわかりました。

于 2014-01-14T15:14:30.317 に答える