2012-12-12 11 views
7

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

Twój kod jest trudny do odczytania, ale jesteś na dobrej drodze, więc jaki jest problem z tym, co próbujesz? –

+0

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! –

+0

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) –

Odpowiedz

1

Na podstawie sugestii Thomasa próbowałem wysłać kolejną prośbę, a po prostu zastąpiłem ładunek i odbiornik metodą RequestTransport.send(), a to zadziałało; Przypuszczam, że nie ma dalszego kontekstu zachowywanego przez fabrykę żądań i że odpowiedź z serwera jest wystarczająca, aby RF określiło, co należy zrobić, aby rozpakować odpowiedź poza wartości request i response, które są zwracane do metody RequestCallback.onResponseReceived(). Jeśli ktoś jest zainteresowany obejrzeniem mojego kodu, po prostu daj mi znać, a ja go tutaj zamieściłem.

0

Jest to możliwe, ale trzeba dużo do zrobienia.

Miałem ten sam pomysł. Szukałem dobrego rozwiązania przez około 2 dni. Próbowałem przechwycić wywołanie serwera na RequestContext.java i na innych klasach. Ale jeśli to zrobisz, musisz stworzyć własną implementację dla niemal każdej klasy zapytań o wątki. Postanowiłem więc zastosować znacznie prostsze podejście.

Wszędzie tam, gdzie wystrzeliłem Wniosek, obsłużyłem odpowiedź i ponownie wystrzeliłem. Oczywiście musisz uważać, aby nie dostać się do pętli.