2009-11-15 200 views
2

我有一個Employee類代碼共享

@PersistenceCapable(identityType = IdentityType.APPLICATION) 
    public class Employee { 
     @PrimaryKey 
     @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
     private Key key; 

     @Persistent 
     private String firstName; 

     @Persistent 
     private String lastName; 

     @Persistent 
     private Date hireDate; 

     public Employee(String firstName, String lastName, Date hireDate) { 
      this.firstName = firstName; 
      this.lastName = lastName; 
      this.hireDate = hireDate; 
     } 

     // Accessors for the fields. JDO doesn't use these, but your application does. 

     public Key getKey() { 
      return key; 
     } 

     public String getFirstName() { 
      return firstName; 
     } 
     public void setFirstName(String firstName) { 
      this.firstName = firstName; 
     } 

     public String getLastName() { 
      return lastName; 
     } 
     public void setLastName(String lastName) { 
      this.lastName = lastName; 
     } 

     public Date getHireDate() { 
      return hireDate; 
     } 
     public void setHireDate(Date hireDate) { 
      this.hireDate = hireDate; 
     } 
    } 

我已經使用了JDO的應用程序引擎。現在我想在服務器和客戶端之間共享這段代碼。我應該保留哪些包。其實我已經嘗試過兩種方式。都沒有解決。如果您已經完成了這種類型的代碼,請分享。

回答

0

我以前做過這個,但只是在一個小測試應用程序。假設你使用GWT-RPC,它應該工作得很順利。你必須做兩件事:

  1. 把代碼放在'客戶'命名空間,即在一個由GWT編譯的目錄。您仍然可以在服務器上使用此代碼。
  2. 點擊編譯並開始修復錯誤。你會發現主要的是'鑰匙'類型不可用於GWT的土地。您可以改爲使用字符串編碼密鑰。請參閱relevant documentation中的「鍵爲編碼字符串」部分。

如果您不使用GWT-RPC,那麼您就是您自己的。 JSON對此目的很有吸引力,但需要大量的工作。在GWT 2.0中這應該會更好,但不會完全消失。

+0

這解決了編譯時的錯誤,但是 但是SerializationException不能這樣解決。 – iftee 2009-11-19 20:42:37

+0

什麼SerializationException? – 2009-11-20 01:58:51

1

如果你正在尋找的是在客戶端和服務器實例化你的實體,將這些類放在「客戶端」包下就可以了。

但是,如果你想通過RPC傳遞你的持久化實體,那可能不會開箱即用。 DataNucleus「使用」字節碼,並且RPC無法序列化。休眠有類似的問題,請看看this article,它很好地解釋了這個問題,並提出了替代方案。

我正在創建DTO來解決此問題。這是一個更多的工作,但它取決於你有多少實體。

+0

非常感謝您的鏈接。我不知道,爲什麼我沒有得到它在谷歌搜索.. – iftee 2009-11-19 20:40:27

0

我們可能需要更多的細節,因爲你可能會被擊中了一些問題,但這裏的一些提示:

  • 包不那麼重要了,只要GWT編譯器和javac既可以看見。我將共享代碼保存在一個名爲「共享」的軟件包中。 :)

  • 密碼在GWT中不可用,所以請使用encoded string Key

  • JDO很棘手,但可行。 GWT的新版本(Java AppEngine發佈後)已經能夠處理DataNucleus的JDO增強。如果DataNucleus是您的問題,我會確保您正在使用幹線或最近的快照。

  • 確保在將對象發送給客戶端之前分離您的對象。

0

這就是爲什麼我使用低級別的API。我寫了一個幫助類,將實體轉換爲pojo並返回。通過這種方式,我得到了轉換成我想要的POJO然後去客戶端的實體。從客戶端,同一個POJO返回服務器被我的helper類轉換成一個實體,然後一個簡單的「put」調用就完成了。你不需要解開/附加任何東西......如果你願意,我可以分享一些代碼。