【问题标题】:How to resend a GWT RequestFactory request如何重新发送 GWT RequestFactory 请求
【发布时间】:2012-11-29 19:12:29
【问题描述】:

是否可以重新发送 RequestFactory 传输?我想做与此等效的操作:How to resend a GWT RPC request 使用 RequestFactory 时。从先前的请求重新发送相同的有效负载相当简单,但我还需要调用相同的方法。这是我的 RequestTransport 类,我希望在处理好(在这种情况下)对用户的登录凭据请求之后“重新触发”原始请求:

package org.greatlogic.rfexample2.client;

import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.Response;
import com.google.web.bindery.requestfactory.gwt.client.DefaultRequestTransport;
/**
 * Every request factory transmission will pass through the single instance of this class. This can
 * be used to ensure that when a response is received any global conditions (e.g., the user is no
 * longer logged in) can be handled in a consistent manner.
 */
public class RFERequestTransport extends DefaultRequestTransport {
//--------------------------------------------------------------------------------------------------
private IClientFactory _clientFactory;
//==================================================================================================
private final class RFERequestCallback implements RequestCallback {
private RequestCallback _requestCallback;
private RFERequestCallback(final RequestCallback requestCallback) {
  _requestCallback = requestCallback;
} // RFERequestCallback()
@Override
public void onError(final Request request, final Throwable exception) {
  _requestCallback.onError(request, exception);
} // onError()
@Override
public void onResponseReceived(final Request request, final Response response) {
  if (response.getStatusCode() == Response.SC_UNAUTHORIZED) {
    _clientFactory.login();
  }
  else {
    _clientFactory.setLastPayload(null);
    _clientFactory.setLastReceiver(null);
    _requestCallback.onResponseReceived(request, response);
  }
} // onResponseReceived()
} // class RFERequestCallback
//==================================================================================================
@Override
protected void configureRequestBuilder(final RequestBuilder builder) {
  super.configureRequestBuilder(builder);
} // configureRequestBuilder()
//--------------------------------------------------------------------------------------------------
@Override
protected RequestCallback createRequestCallback(final TransportReceiver receiver) {
  return new RFERequestCallback(super.createRequestCallback(receiver));
} // createRequestCallback()
//--------------------------------------------------------------------------------------------------
void initialize(final IClientFactory clientFactory) {
  _clientFactory = clientFactory;
} // initialize()
//--------------------------------------------------------------------------------------------------
@Override
public void send(final String payload, final TransportReceiver receiver) {
  String actualPayload = _clientFactory.getLastPayload();
  TransportReceiver actualReceiver;
  if (actualPayload == null) {
    actualPayload = payload;
    actualReceiver = receiver;
    _clientFactory.setLastPayload(payload);
    _clientFactory.setLastReceiver(receiver);
  }
  else {
    actualReceiver = _clientFactory.getLastReceiver();
  }
  super.send(actualPayload, actualReceiver);
} // send()
//--------------------------------------------------------------------------------------------------
}

【问题讨论】:

  • 您的代码难以阅读,但您在正确的轨道上,那么您尝试的问题是什么?
  • 我的问题是知道如何启动触发 SC_UNAUTHORIZED 响应的请求。例如,如果我有请求 requestContext.getFooById(fooId).fire(...) 并且此请求返回未经授权的响应,那么我想再次触发它。我可以发送相同的有效负载,并回调到相同的接收器,但我不知道如何自动将“fire()”应用于“getFooId()”。 (顺便说一句,是什么让我的代码“难以阅读”......我很好奇?)。谢谢!
  • 如果你用同一个接收者发送同一个有效载荷会发生什么?我的猜测是它应该只是工作™。 (我发现你的代码因为缺少缩进而难以阅读——主要是——、缺少空行以及太多无用的 cmets;我猜这是一个品味问题)
  • 我可能会触发 any 请求,并且通过覆盖有效负载将导致调用最初生成有效负载的任何内容(在本例中为 getFooById()) ……是这样吗?
  • 谢谢托马斯...我会添加更多的空行!确实,我缩进了 2,而不是 4……就像你说的那样,只是品尝。

标签: gwt gwt-rpc requestfactory


【解决方案1】:

根据 Thomas 的建议,我尝试发送另一个请求,并在 RequestTransport.send() 方法中替换了有效负载和接收器,这很有效;我猜请求工厂没有保留进一步的上下文,并且来自服务器的响应足以让 RF 确定需要做什么来解压缩返回到 @987654324 的 requestresponse 之外的响应@ 方法。如果有人有兴趣查看我的代码,请告诉我,我会在这里发布。

【讨论】:

    【解决方案2】:

    这是可能的,但你有很多事情要做。

    我也有同样的想法。我正在寻找一个好的解决方案大约 2 天。我试图拦截 RequestContext.java 和其他类的服务器调用。但是如果你这样做,你必须为几乎每一类 gwt requestfactories 进行自己的实现。所以我决定采用更简单的方法。

    在我发出请求的任何地方,我都会处理响应并再次触发它。 当然,你必须小心,不要陷入循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-28
      • 2011-10-11
      • 2011-06-25
      • 2023-03-30
      • 1970-01-01
      • 2012-06-18
      • 2011-06-26
      • 1970-01-01
      相关资源
      最近更新 更多