2011-12-02 66 views
1

由於我的項目的體系結構,我有一個問題。GWT EJB轉移對象

一方有一個GWT包與客戶端,還有一個Servlet與EJB項目進行通信。另一方面,有一個EJB會話Bean和實體的項目應該存儲在數據庫中,並在GWT客戶端和數據庫之間發送。但我不知道我怎麼能意識到這一點。

如何將我的會話Bean中的對象發送到GWT Servlet,因爲GWT Servlet不知道實體類。

那是我的項目結構:

實體+會話Bean: http://pastebin.com/anAbCqgd

GWT的Servlet: http://pastebin.com/Ujjka9vT

我希望,那麼很顯然,我的問題是;)

回答

2

BeanServiceImpl可以瞭解你的EJB實體。這只是GWT項目中不能的客戶端一側。因此,在您的server軟件包的某個位置,您需要一個翻譯器/編碼器/轉換器從您的EJB實體Company切換到客戶端的CompanyDTO。它可以具有所有相同的字段,實際上,不僅僅是@Entity註釋。像這樣:

private CompanyDTO convert(Company ejb) { 
    CompanyDTO dto = new CompanyDTO(ejb.getName()); 
    dto.setAddress(ejb.getAddress()); 
    return dto; 
} 

那麼你的客戶端GWT代碼,可以處理這些DTO的,翻譯回在服務器端的實體,當你需要進行交易。

+0

謝謝,這工作,但它會產生重複的代碼,並將其會更復雜。你有沒有測試過RequestFactory? – ph09

+0

@ ph09絕對是它重複的代碼。 RequestFactory可以替代,但我自己並沒有實現任何解決方案。我已經研究過它,但在我們的架構中,它並不是完全切割和實施的。 – Jason482

+0

我發現了一個解決方案: @OneToMany(cascade = {CascadeType.PERSIST}, fetch = FetchType.EAGER) private collection personen = new Vector (); 帶註釋FetchType.Eager您可以將對象集合及其引用發送到客戶端。 – ph09

0

我嘗試這樣做,我能夠從客戶端發送對象到EJB的商店它在一個MySQL數據庫: http://www.vogella.de/articles/GWT/ar01s08.html

但是當我嘗試將其發送回客戶端,我總是得到一個異常: com.google.gwt.user.client.rpc.SerializationException:類型'org.eclipse.persistence.indirection.IndirectList'未包含在可由此SerializationPolicy或其Class對象序列化的類型集中被加載。爲了安全起見,這種類型將不會被序列化:例如= {IndirectList:不實例}

因此,我認爲你必須使用DTO的..