6

私の GWT アプリ全体で、さまざまなサービスを使用して、サーバーへのさまざまな非同期呼び出しが行われています。エラー処理を改善するために、すべてのコールバックをラップして、1 か所で例外を処理できるようにしたいと考えていますInvocationExceptionsAsyncCallbackすべての非同期呼び出しを変更する必要があることを意味するため、スーパークラスの実装は実際にはオプションではありません。

RpcServiceProxy#doCreateRequestCallback()オーバーライドする方法のようです。十分に単純です。GWT で新しいクラスを使用する方法がわかりません。

質問を述べる別の方法は、

GWT に の独自のサブクラスを使用させるにはどうすればよいRpcServiceProxyですか?

4

4 に答える 4

9

AsynCallback<T>any に渡されたeveryをラップするにはRemoteService、オーバーライドする必要があります。RemoteServiceProxy#doCreateRequestCallback()AsynCallback<T>

これを行う手順は次のとおりです。

@ChrisLercher が示唆したように、プロキシが生成されるたびに介入する独自のプロキシ ジェネレータを定義する必要がありますRemoteService。を拡張ServiceInterfaceProxyGeneratorしてオーバーライドすることから始めます#createProxyCreator()

/**
 * This Generator extends the default GWT {@link ServiceInterfaceProxyGenerator} and replaces it in the
 * co.company.MyModule GWT module for all types that are assignable to
 * {@link com.google.gwt.user.client.rpc.RemoteService}. Instead of the default GWT {@link ProxyCreator} it provides the
 * {@link MyProxyCreator}.
 */
public class MyServiceInterfaceProxyGenerator extends ServiceInterfaceProxyGenerator {
    @Override
    protected ProxyCreator createProxyCreator(JClassType remoteService) {
        return new MyProxyCreator(remoteService);
    }
}

遅延バインディングを使用してMyModule.gwt.xml、 GWT がタイプの何かを生成するたびに、プロキシジェネレーターを使用してコンパイルするように指示しますRemoteService

<generate-with 
   class="com.company.ourapp.rebind.rpc.MyServiceInterfaceProxyGenerator">
    <when-type-assignable class="com.google.gwt.user.client.rpc.RemoteService"/>
</generate-with>

拡張ProxyCreatorしてオーバーライドします#getProxySupertype()。で使用してMyServiceInterfaceProxyGenerator#createProxyCreator()、生成されたすべての基本クラスを定義できるようにしますRemoteServiceProxies

/**
 * This proxy creator extends the default GWT {@link ProxyCreator} and replaces {@link RemoteServiceProxy} as base class
 * of proxies with {@link MyRemoteServiceProxy}.
 */
public class MyProxyCreator extends ProxyCreator {
    public MyProxyCreator(JClassType serviceIntf) {
        super(serviceIntf);
    }

    @Override
    protected Class<? extends RemoteServiceProxy> getProxySupertype() {
        return MyRemoteServiceProxy.class;
    }
}

あなたMyProxyCreatorとあなたの両方MyServiceInterfaceProxyGeneratorが、GWT によって JavaScript にクロスコンパイルされないパッケージに配置されていることを確認してください。そうしないと、次のようなエラーが表示されます。

[ERROR] Line XX: No source code is available for type com.google.gwt.user.rebind.rpc.ProxyCreator; did you forget to inherit a required module?

これで、拡張RemoteServiceProxyおよびオーバーライドする準備が整いました#doCreateRequestCallback()! ここで好きなことをして、サーバーに送られるすべてのコールバックに適用できます。このクラスと、ここで使用する他のクラス (私の場合AsyncCallbackProxy) をクライアント パッケージに追加して、クロスコンパイルするようにしてください。

/**
 * The remote service proxy extends default GWT {@link RemoteServiceProxy} and proxies the {@link AsyncCallback} with
 * the {@link AsyncCallbackProxy}.
 */
public class MyRemoteServiceProxy extends RemoteServiceProxy {
    public MyRemoteServiceProxy(String moduleBaseURL, String remoteServiceRelativePath, String serializationPolicyName,
                                 Serializer serializer) {
        super(moduleBaseURL, remoteServiceRelativePath, serializationPolicyName, serializer);
    }

    @Override
    protected <T> RequestCallback doCreateRequestCallback(RequestCallbackAdapter.ResponseReader responseReader,
                                                          String methodName, RpcStatsContext statsContext,
                                                          AsyncCallback<T> callback) {
        return super.doCreateRequestCallback(responseReader, methodName, statsContext, new AsyncCallbackProxy<T>(callback));
    }
}

参考文献:

于 2013-07-04T15:34:00.773 に答える
2

あなたが探している型はおそらくRemoteServiceProxy(not RpcServiceProxy) であり、デフォルトのバインディングをオーバーライドすることから始める必要があると思います/com/google/gwt/user/RemoteService.gwt.xml(行を独自の .gwt.xml ファイルにコピーして調整するだけです):

<generate-with 
       class="com.google.gwt.user.rebind.rpc.ServiceInterfaceProxyGenerator">
    <when-type-assignable class="com.google.gwt.user.client.rpc.RemoteService"/>
</generate-with>

そこに がありprotected Class<? extends RemoteServiceProxy> getProxySupertype()、これをオーバーライドして独自のRemoteServiceProxyクラスを返すことができます。

まだ試していないので、これにはいくつかの追加手順が必要になる可能性があります...

于 2013-07-01T15:38:43.467 に答える
0

通常、非同期プロセスで発生する例外を GWT で処理する方法は、UncaughtExceptionHandlers.

これらの例外を管理するには、独自のハンドラーを使用します。

GWT.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
  public void onUncaughtException(Throwable e) {
    if (e instanceof WhateverException) {
      // handle the exception here
    }        
  }
});

これを使用すると、何もサブクラス化する必要はありません。

于 2013-07-01T15:39:07.577 に答える