2012-12-12 62 views
7

是否可以重新发送RequestFactory传输?在使用RequestFactory时,我希望这样做:How to resend a GWT RPC request。从以前的请求重新发送相同的有效负载相当简单,但我也需要调用相同的方法。这是我的RequestTransport课,我希望服用后护理只是“重烧”原来的要求,在这种情况下,用户的请求登录凭据:如何重新发送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()”。 (顺便说一下,是什么让我的代码“难以阅读”......我很好奇?“)。谢谢! –

+0

如果你用相同的接收器发送相同的负载,会发生什么?我的猜测是它应该Just Work™。我发现你的代码很难阅读,因为缺乏缩进 - 主要 - 缺少空行和太多无用的评论;这是我猜想的味道的问题) –

回答

1

根据托马斯的建议,我试着发送另一个请求,并在RequestTransport.send()方法中替换了有效载荷和接收器,并且工作正常;我猜想请求工厂没有保留更多的上下文,并且来自服务器的响应足以让RF确定需要做什么才能将响应解压到requestresponse之外,并返回到RequestCallback.onResponseReceived()方法。如果任何人有兴趣看到我的代码,然后让我知道,我会在这里发布。

0

这是可能的,但你有很多去做。

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

无论何处,我解雇了一个请求,我处理了这个响应并再次解雇了它。 当然,你必须小心,你不会陷入循环。

相关问题