7

RequestFactory送信を再送することは可能ですか?これと同等のことをしたいと思います:RequestFactoryを使用するときにGWTRPCリクエストを再送信する方法。以前のリクエストから同じペイロードを再送信するのはかなり簡単ですが、同じメソッドを呼び出す必要もあります。これが私の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()
//--------------------------------------------------------------------------------------------------
}
4

2 に答える 2

1

Thomasの提案に基づいて、別のリクエストを送信しようとしましたが、RequestTransport.send()メソッドのペイロードとレシーバーを置き換えただけで、これは機能しました。リクエストファクトリによって保持されるコンテキストはこれ以上ないと思います。サーバーからの応答は、RFが、メソッドに返される応答を超えて応答を解凍するために何を行う必要があるかを判断するのに十分であるrequestと思います。誰かが私のコードを見ることに興味があるなら、私に知らせてください、そして私はそれをここに投稿します。responseRequestCallback.onResponseReceived()

于 2012-12-13T03:29:36.003 に答える
0

可能ですが、やるべきことがたくさんあります。

私も同じ考えを持っていました。そして私は約2日間良い解決策を探していました。RequestContext.javaおよび他のクラスでサーバー呼び出しをインターセプトしようとしました。ただし、これを行う場合は、ほぼすべてのクラスのgwtリクエストファクトリに対して独自の実装を作成する必要があります。だから私はもっと簡単なアプローチをとることにしました。

リクエストを実行したすべての場所で、応答を処理して再度実行しました。もちろん、ループに入らないように注意する必要があります。

于 2012-12-12T08:56:45.840 に答える