2012-12-12 42 views
7

Có thể gửi lại yêu cầu truyền RequestFactory không? Tôi muốn làm tương đương với điều này: How to resend a GWT RPC request khi sử dụng RequestFactory. Nó khá đơn giản để gửi lại cùng một tải trọng từ một yêu cầu trước đó, nhưng tôi cũng cần phải thực hiện một cuộc gọi đến cùng một phương thức. Đây là lớp RequestTransport của tôi và tôi hy vọng chỉ "hoàn thành" yêu cầu ban đầu sau khi xử lý, trong trường hợp này, yêu cầu cho người dùng về thông tin đăng nhập:Cách gửi lại yêu cầu 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

Mã của bạn khó đọc, nhưng bạn đang đi đúng hướng, vậy vấn đề với những gì bạn đã thử là gì? –

+0

Vấn đề của tôi là biết cách bắt đầu yêu cầu đã kích hoạt phản hồi SC_UNAUTHORIZED. Ví dụ, nếu tôi có yêu cầu 'requestContext.getFooById (fooId) .fire (...)' và yêu cầu này trả về phản hồi trái phép thì tôi muốn kích hoạt lại nó. Tôi có thể gửi cùng một tải trọng và gọi lại cho cùng một bộ thu, nhưng tôi không biết cách tự động áp dụng "fire()" thành "getFooId()". (btw, những gì làm cho mã của tôi "khó đọc" ... Tôi rất tò mò? "). Cảm ơn! –

+0

Điều gì sẽ xảy ra nếu bạn gửi cùng một tải trọng với cùng một máy thu? Đoán của tôi là nó nên Just Work ™. (Tôi thấy mã của bạn khó đọc bằng cách thiếu thụt đầu dòng - thông thường–, thiếu các dòng trống, và quá nhiều nhận xét vô dụng; đó là vấn đề về hương vị tôi đoán) –

Trả lời

1

Dựa trên đề xuất của Thomas Tôi đã thử gửi một yêu cầu khác và chỉ thay thế trọng tải và người nhận theo phương thức RequestTransport.send() và điều này đã hiệu quả; Tôi đoán không có thêm bối cảnh nào được giữ lại bởi nhà máy yêu cầu và phản hồi từ máy chủ là đủ để RF xác định những gì cần phải thực hiện để giải nén phản hồi vượt quá requestresponse được trả về phương thức RequestCallback.onResponseReceived(). Nếu có ai muốn xem mã của tôi thì hãy cho tôi biết và tôi sẽ đăng nó ở đây.

0

Có thể, nhưng bạn có nhiều làm.

Tôi cũng có ý tưởng tương tự. Và tôi đã tìm kiếm một giải pháp tốt trong khoảng 2 ngày. Tôi đã cố gắng chặn cuộc gọi của máy chủ trên RequestContext.java và trên các lớp khác. Nhưng nếu bạn làm điều đó bạn phải thực hiện của riêng bạn cho gần như mọi lớp của requestfactories gwt. Vì vậy, tôi quyết định đi một cách tiếp cận đơn giản hơn nhiều.

Ở mọi nơi tôi đã gửi Yêu cầu, tôi đã xử lý phản hồi và kích hoạt lại. Tất nhiên bạn phải cẩn thận, rằng bạn không tham gia vào vòng lặp.

Các vấn đề liên quan