2012-12-12 8 views
7

क्या यह संभव है एक RequestFactory प्रसारण पुनः भेजने के लिए पुन: भेजने के लिए? मैं इसके बराबर करना चाहता हूं: How to resend a GWT RPC request RequestFactory का उपयोग करते समय। पिछले अनुरोध से वही पेलोड भेजना काफी आसान है, लेकिन मुझे उसी विधि में कॉल करने की भी आवश्यकता है। यहाँ मेरी 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 (...)' और यह अनुरोध अनधिकृत प्रतिक्रिया देता है तो मैं इसे फिर से आग लगाना चाहता हूं। मैं वही पेलोड भेज सकता हूं, और उसी रिसीवर को कॉलबैक भेज सकता हूं, लेकिन मुझे नहीं पता कि "getFooId()" को स्वचालित रूप से "आग()" को कैसे लागू किया जाए। (Btw, क्या मेरी कोड बनाया "कठिन पढ़ने के लिए" ... मैं बहुत उत्सुक हूँ? ")। धन्यवाद! –

+0

यदि आप एक ही रिसीवर के साथ एक ही पेलोड भेजने क्या होता है? मेरा अनुमान है कि यह सिर्फ काम ™ चाहिए। (मैं अपने कोड खरोज -primarily-, रिक्त लाइनों, और भी कई बेकार टिप्पणियों की कमी की कमी से पढ़ने के लिए मुश्किल लगता है, यह स्वाद मुझे लगता है) –

उत्तर

1

थॉमस के सुझाव के आधार पर मैंने एक और अनुरोध भेजने की कोशिश की, और केवल RequestTransport.send() विधि में पेलोड और रिसीवर को बदल दिया, और यह काम किया; मुझे लगता है कि अनुरोध कारखाने द्वारा कोई और संदर्भ नहीं रखा गया है, और यह सुनिश्चित करने के लिए सर्वर से प्रतिक्रिया आरएफ के लिए पर्याप्त है कि request और response से परे प्रतिक्रिया को अनपैक करने के लिए क्या करने की आवश्यकता है जो RequestCallback.onResponseReceived() विधि पर वापस आ गए हैं। अगर कोई मेरा कोड देखने में रूचि रखता है तो बस मुझे बताएं और मैं इसे यहां पोस्ट करूंगा।

0

यह संभव है, लेकिन आप एक बहुत कुछ है करने के लिए।

मेरे पास एक ही विचार था। और मैं लगभग 2 दिनों के लिए एक अच्छा समाधान खोज रहा था। मैंने RequestContext.java और अन्य कक्षाओं पर सर्वर कॉल को अवरुद्ध करने का प्रयास किया। लेकिन यदि आप ऐसा करते हैं तो आपको gwt requestfactories के लगभग हर वर्ग के लिए अपना स्वयं का कार्यान्वयन करना होगा। तो मैंने एक बहुत आसान दृष्टिकोण जाने का फैसला किया।

हर जगह जहां मैंने एक अनुरोध निकाल दिया, मैंने प्रतिक्रिया संभाली और इसे फिर से निकाल दिया। बेशक आपको देखभाल करना है, कि आप एक पाश में नहीं आते हैं।