2011-02-11 88 views
6

我的GWT應用程序有十種不同類型的實體。現在我使用普通的舊DTO並通過GWT-RPC傳輸它們。這適用於像啓動一樣的情況 - 我可以將它們全部打包成一個請求。GWT RequestFactory和多種類型

我正在考慮切換到RequestFactory,因爲在我需要更新一種類型的實體時,應用程序的整個生命週期內(有30分鐘的平均時間)有很多次,並且統一/帶寬節省功能RequestFactory很有吸引力。但是:當應用程序加載時,我看不到在單個請求中下載所有初始化數據的方法。我不想提出十個請求來獲取我的十個實體類型的所有init數據。

有沒有辦法使一個GeneralRequestContext,或什麼?我甚至很高興與像一個解決方案:

public interface InitDataProxy extends EntityProxy 
{ 
    public UserProxy getInitUsers(); 
    public OrganizationProxy getInitOrganizations(); 
    ... 
} 

public interface GeneralRequestContext extends RequestContext 
{ 
    Request<InitDataProxy> getInitData(); 
} 

但是,這將無法工作,因爲我不希望有真正回到InitDataProxy任何事情,我只是想用它來一堆的結合不同類型的代理在一個請求中。

因此:有沒有辦法在單個請求中接收多個不相關的EntityProxy類型?

我也很高興做出一個正常的gwt-rpc請求去這個數據的RequestFactory之外,但我不想實現重複的DTO來運行旁邊的RequestFactory的代理,並編寫自定義代碼將DTO複製到它們中!

回答

4

InitDataProxy可能會擴展ValueProxy而不需要服務器上的對象具有任何種類的id或版本語義。域端InitData類型可能是一個接口,可能使用匿名類型實現。

interface InitData { 
    User getUser(); 
    Organization getOrgatization(); 
} 
class InitService { 
    static InitData makeInitData() { 
    return new InitData() { ..... }; 
    } 
} 

@ProxyFor(InitData.class) 
interface InitDataProxy extends ValueProxy { 
    UserProxy getUser(); 
    OrganizationProxy getOrganization(); 
} 
@Service(InitService.class) 
interface Init extends RequestContext { 
    Request<InitDataProxy> makeInitData(); 
} 
+0

啊,太好了。謝謝 - 這帶來了我和RF之間的突出障礙數量減少到一個,我感覺它也崩潰了!我感謝你的工作! –

+4

RequestContext可以看作是一個「方法調用包」,它允許您在單個HTTP請求中對它們進行批處理。這意味着您不必將結果合併到一個類型中;你可以在RequestContext上調用幾個方法,然後fire()將方法調用作爲「批處理」發送到服務器。 –

+0

嘿,剛剛看到這個,並會盡快與ValueProxy一起嘗試。但是,上次我嘗試了ValueProxys(不記得GWT版本)GWT一直抱怨ValueProxy代表的類缺少默認構造函數,並且缺少屬性的setter方法。讓我們來看看這是否適用於當前版本:) – Gandalf