Czy można ponownie wysłać transmisję RequestFactory? Chciałbym zrobić odpowiednik tego: How to resend a GWT RPC request podczas korzystania z RequestFactory. Ponowne przesłanie tego samego ładunku z poprzedniego żądania jest dość proste, ale muszę również wywołać tę samą metodę. Oto moja klasa RequestTransport, i mam nadzieję, że po prostu „refire” pierwotnego wniosku po opiekę, w tym przypadku, prośba do użytkownika o podanie poświadczeń logowania:Jak wysłać ponownie żądanie 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()
//--------------------------------------------------------------------------------------------------
}
Twój kod jest trudny do odczytania, ale jesteś na dobrej drodze, więc jaki jest problem z tym, co próbujesz? –
Mój problem polega na tym, jak zainicjować żądanie, które spowodowało odpowiedź SC_UNAUTHORIZED. Na przykład, jeśli mam żądanie 'requestContext.getFooById (fooId) .fire (...)' i to żądanie zwraca nieautoryzowaną odpowiedź, a następnie chcę ją ponownie uruchomić. Mogę wysłać ten sam ładunek i wywołanie zwrotne do tego samego odbiornika, ale nie wiem, jak automatycznie zastosować "fire()" do "getFooId()". (btw, co sprawiło, że mój kod jest "trudny do odczytania" ... jestem bardzo ciekawy? ") Dzięki! –
Co się stanie, jeśli wyślesz ten sam ładunek z tym samym odbiornikiem? Domyślam się, że powinien on działać po prostu w trybie pracy. (Uważam, że twój kod jest trudny do odczytania z powodu braku wcięcia - zazwyczaj - brak pustych linii i zbyt wielu bezużytecznych komentarzy, to chyba kwestia gustu) –