2012-12-12 9 views
7

RequestFactory送信を再送信することは可能ですか? RequestFactoryを使用するときは、これと同等の処理をしたいと思います。How to resend a GWT RPC request以前のリクエストから同じペイロードを再送するのはかなり簡単ですが、同じメソッドを呼び出す必要もあります。ここに私のRequestTransportクラスだ、と私はただ、この場合には、ログイン資格情報のためにユーザに要求するの世話をした後、元の要求を「refire」に期待しています:GWT RequestFactoryリクエストを再送するには

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() 
//-------------------------------------------------------------------------------------------------- 
} 
+0

あなたのコードは読みにくいですが、あなたは正しい道を歩いているので、試したことで何が問題になっていますか? –

+0

私の問題は、SC_UNAUTHORIZED応答をトリガしたリクエストを開始する方法を知っていることです。例えば、私が 'requestContext.getFooById(fooId).fire(...) 'というリクエストを受け取った場合、このリクエストは不正な応答を返します。同じペイロードとコールバックを同じ受信者に送信できますが、「fire()」を「getFooId()」に自動的に適用する方法はわかりません。 (btw、私のコードを「読みにくい」...私は非常に興味がありますか?))ありがとう! –

+0

同じペイロードを同じレシーバーで送信するとどうなりますか?私はあなたのコードがインデントの欠如によって読みにくいことを発見しました - 主に、空白行がなく、無駄なコメントが多すぎます;それは私が推測する味の問題です) –

答えて

1

トーマスの提案に基づいて、もう1つのリクエストを送信しようとしましたが、RequestTransport.send()メソッドでペイロードと受信者を置き換えただけです。リクエスト・ファクトリによって保持されているコンテキストはもうないと思っており、RequestCallback.onResponseReceived()メソッドに返されたrequestresponseを超えてレスポンスをアンパックするために、RFが何を行う必要があるかをRFが判断するのに十分です。誰かが自分のコードを見たいと思ったら、私に知らせてください。ここに投稿します。

0

それは可能ですが、あなたは多くを持っていますする。

私は同じ考えを持っていました。そして私は約2日間良い解決策を探していました。私はRequestContext.javaと他のクラスのサーバーコールをインターセプトしようとしました。しかし、そうするなら、gwt requestfactoriesのほぼすべてのクラスに対して独自の実装を行わなければなりません。だから私ははるかに簡単なアプローチに行くことにしました。

私がリクエストを発したどこでも、私はレスポンスを処理し、再びそれを解雇しました。 もちろん、あなたはループに入ることはないように注意しなければなりません。

関連する問題