代码共享

代码共享

问题描述:

我有一个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的应用程序引擎。现在我想在服务器和客户端之间共享这段代码。我应该保留哪些包。其实我已经尝试过两种方式。都没有解决。如果您已经完成了这种类型的代码,请分享。

我以前做过这个,但只是在一个小测试应用程序。假设你使用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

如果你正在寻找的是在客户端和服务器实例化你的实体,将这些类放在“客户端”包下就可以了。

但是,如果你想通过RPC传递你的持久化实体,那可能不会开箱即用。 DataNucleus“使用”字节码,并且RPC无法序列化。休眠有类似的问题,请看看this article,它很好地解释了这个问题,并提出了替代方案。

我正在创建DTO来解决此问题。这是一个更多的工作,但它取决于你有多少实体。

+0

非常感谢您的链接。我不知道,为什么我没有得到它在谷歌搜索.. – iftee 2009-11-19 20:40:27

我们可能需要更多的细节,因为你可能会被击中了一些问题,但这里的一些提示:

  • 包不那么重要了,只要GWT编译器和javac既可以看见。我将共享代码保存在一个名为“共享”的软件包中。 :)

  • 密码在GWT中不可用,所以请使用encoded string Key

  • JDO很棘手,但可行。 GWT的新版本(Java AppEngine发布后)已经能够处理DataNucleus的JDO增强。如果DataNucleus是您的问题,我会确保您正在使用干线或最近的快照。

  • 确保在将对象发送给客户端之前分离您的对象。

这就是为什么我使用低级别的API。我写了一个帮助类,将实体转换为pojo并返回。通过这种方式,我得到了转换成我想要的POJO然后去客户端的实体。从客户端,同一个POJO返回服务器被我的helper类转换成一个实体,然后一个简单的“put”调用就完成了。你不需要解开/附加任何东西......如果你愿意,我可以分享一些代码。