2012-11-01 131 views
0

我使用AppEngine(Java)和GWT來設計我的應用程序。我有一個類表示客戶端(GWT)和服務器(AppEngine)都執行的對象。現在,我有一個AppEngine類(其中包含所有服務器端信息)和客戶端使用的共享目錄中的類(並在RPC調用之間傳遞)。現在我需要在兩者之間進行轉換的方法,並重現服務器和客戶端所需的方法。這讓我很頭疼,當班級變得更復雜時,我發現錯誤很容易發生。在GWT和AppEngine之間共享類

我之所以不只是創建一個共享類,是因爲我不想將我的服務器的某些邏輯,方法和屬性公開給客戶端。但是我在閱讀GWT編譯時會丟棄未使用的方法和編譯代碼中的屬性。這是真的嗎?這會保護我不想在客戶端上看到的代碼嗎?是否有任何我應該知道的陷阱?因爲它會混淆名稱,所以屬性更不用擔心(我認爲)。我知道我可以使用transient關鍵字,因此服務器數據不會發送到RPC調用中的客戶端。

什麼是最好的是我可以把方法,讓GWT編譯器知道它不應該編譯這種方法,我知道它永遠不會進入編譯的JavaScript的註釋。

最後,如果我保持代碼分離有這種情況下的最佳做法?

+0

請參閱這裏的類似問題的答案:http://stackoverflow.com/questions/13184881/annotation-for-gwt-compiler-to-ignore-method/13185612 –

回答

0

如果我正確理解你的問題,我會說這不是一個好設計。共享目錄中的序列化對象應該是純POJO,您不應該在這些類中混合使用業務邏輯。

+0

其實我認爲你是錯的。如果我需要服務器上的貓和客戶端上的貓,爲什麼我應該有一個ClientCat類,一個ServerCat類,然後是一個CatDTO,用於將ClientCat傳輸到ServerCat。所有的貓都會喵喵叫,吃東西和睡覺,所以我不得不至少兩次寫出所有這些方法,唯一的區別是ServerCat有一些只會在服務器上執行的操作,我不希望它與用戶共享。這似乎是一個很好的設計。 – Michael

0

我發現了一個解決方法,主要解決我的問題。

我可能有一個類調用我的代碼的服務器組件,這將使GWT編譯崩潰,因爲它無法訪問該類(稱爲com.myproject.server.Class1)。我可以在gwt.xml文件(參見http://code.google.com/p/google-web-toolkit-doc-1-5/wiki/DevGuideModuleXml)中覆蓋GWT中的包實現,並創建一個com.myproject.client.com.myproject.server.Class1類,該類實現被調用的方法,但可以返回null。這樣GWT有一個可以編譯的鏈接類。後來在GWT編譯中,它應該放棄這個類/方法,因爲它從來沒有(希望)在GWT中被調用。

這可能是一個非常黑客的解決方法,但如果仔細做就可以工作。