gpt4 book ai didi

gwt - 如何将每个回调包装在一个地方以改进错误处理

转载 作者:行者123 更新时间:2023-12-04 17:22:48 25 4
gpt4 key购买 nike

在我的 GWT 应用程序中,有许多对服务器的不同异步调用,使用许多不同的服务。为了更好地处理错误,我想包装我所有的回调,以便我可以处理像 InvocationExceptions 这样的异常。在一个地方。实现 AsyncCallback 的父类(super class)不是一个真正的选择,因为这意味着我必须修改每个异步调用。
RpcServiceProxy#doCreateRequestCallback()看起来像要覆盖的方法。很简单。我只是看不到如何让 GWT 使用我的新类(class)。

陈述问题的另一种方式是

How do I make GWT use my own subclass of RpcServiceProxy?

最佳答案

为了包装每个 AsynCallback<T>传递给任何 RemoteService您需要覆盖 RemoteServiceProxy#doCreateRequestCallback()因为每个 AsynCallback<T>在 RPC 调用发生之前提交到这里。
以下是执行此操作的步骤:
正如@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使用延迟绑定(bind)来指示 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));
}
}

引用:
  • DevGuideCodingBasicsDeferred.html
  • An example applied to performance tracking
  • 关于gwt - 如何将每个回调包装在一个地方以改进错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17401260/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com