GWT app引擎中的代码共享

时间:2009-11-15 02:58:19

标签: google-app-engine gwt jdo code-sharing

我有一个员工类

 @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用于app引擎。现在我想在服务器和客户端之间共享此代码。我应该保留哪个包。事实上我已经尝试过两种方式。都没有成功。如果您已经完成此类代码,请分享。

4 个答案:

答案 0 :(得分:1)

如果您要查找的是在客户端和服务器中实例化您的实体,那么将这些类放在“client”包下就可以了。

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

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

答案 1 :(得分:0)

我以前做过这个,但只是在一个小测试应用程序中。假设您正在使用GWT-RPC,它应该可以非常顺利地运行。你必须做两件事:

  1. 将代码放在“客户端”命名空间中,即放在由GWT编译的目录中。您仍然可以在服务器上使用此代码。
  2. 点击编译并开始修复错误。你会发现主要的一个是在GWT土地上没有“钥匙”类型。您可以使用字符串编码的密钥。请参阅relevant documentation
  3. 中的“密钥作为编码字符串”部分

    如果您没有使用GWT-RPC,那么您就是自己的。 JSON对于此目的很有吸引力,但需要大量的工作。这应该在GWT 2.0中更好,但不会完全消失。

答案 2 :(得分:0)

我们可能需要更多细节,因为您可能会遇到许多问题,但这里有一些提示:

  • 只要GWT编译器和javac都可以看到它,包就无所谓了。我将共享代码保存在一个名为“shared”的软件包中。 :)

  • 密钥在GWT中不可用,因此请使用encoded string Key

  • JDO很棘手,但可行。较新版本的GWT(在Java AppEngine发布之后)已经能够处理DataNucleus的JDO增强。我确保你正在使用主干或最近的快照,以防DataNucleus成为你的问题。

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

答案 3 :(得分:0)

这就是我使用低级API的原因。我编写了一个帮助类,将实体转换为pojo并返回。这样,我得到的实体被转换成我想要的POJO然后转到客户端。从客户端,同样的POJO返回到服务器,由我的帮助程序类转换为实体,然后一个简单的“put”调用就可以了。你不需要拆卸/附加任何东西......如果你愿意,我可以分享一些代码。