【问题标题】:Code sharing in GWT app engineGWT 应用引擎中的代码共享
【发布时间】:2010-12-16 17:21:54
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      • 只要 GWT 编译器和 javac 都能看到该包,它就无关紧要。我将共享代码保存在一个适当命名为...“共享”的包中。 :)

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

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

      • 确保在将对象发送到客户端之前分离它们。

      【讨论】:

        【解决方案3】:

        如果您要在客户端和服务器中实例化您的实体,则将类放在“客户端”包下即可。

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

        我正在创建 DTO 来解决此问题。这需要更多的工作,但这实际上取决于您拥有多少实体。

        【讨论】:

          【解决方案4】:

          我以前做过,但只是在一个小型测试应用程序中。假设您使用的是 GWT-RPC,它应该工作得非常顺利。你必须做两件事:

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

          如果您不使用 GWT-RPC,则只能靠自己。 JSON 对于这个目的很有吸引力,但需要大量的工作。这在 GWT 2.0 中应该会更好,但不会完全消失。

          【讨论】:

          • 这解决了编译时错误但是SerializationException不能用这种方式解决。
          猜你喜欢
          • 2018-01-11
          • 2023-01-18
          • 2012-08-07
          • 1970-01-01
          • 2023-04-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多