AsynCallback<T>
any に渡されたeveryをラップするにはRemoteService
、オーバーライドする必要があります。RemoteServiceProxy#doCreateRequestCallback()
AsynCallback<T>
これを行う手順は次のとおりです。
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));
}
}
AsyncCallbackProxy
これで、次のようになります。
public class AsyncCallbackProxy<T> implements AsyncCallback<T> {
private AsyncCallback<T> delegate;
public AsyncCallbackProxy(AsyncCallback<T> delegate) {
this.delegate = delegate;
}
@Override
public final void onFailure(Throwable caught) {
GWT.log("AsyncCallbackProxy#onFailure() : " + caught.getMessage(), caught);
if (caught instanceof NotLoggedInException) {
// Handle it here
}
delegate.onFailure(proxy);
}
@Override
public final void onSuccess(T result) {
delegate.onSuccess(result);
}
}
参考文献: