在客户端和服务器之间共享 GWT 类实现

Posted

技术标签:

【中文标题】在客户端和服务器之间共享 GWT 类实现【英文标题】:Sharing GWT class implementation between client and server 【发布时间】:2012-11-13 16:55:07 【问题描述】:

假设我在 GWT 中有一个比 POJO 更复杂的类实现,但它的方法仍然相对简单,即除了它的 getter 和 setter 之外,它还有一些实用方法,这样我就可以成功地调用 new Foo()客户端和服务器代码。

我的问题是:如果我有这样一个对象的实例,我如何在 GWT 服务器和客户端之间进行通信?也就是说,如何在对象反序列化时既能传输其字段,又能保留调用其他方法的能力?

我们目前在服务器端使用 Jackson,在客户端使用 AutoBeans,但这仅限于 POJO 类,因为 AutoBeans 来自仅包含 getter 和 setter 的接口,并且无法(自动)将数据拉入更有用的对象。

为了完整起见,这里是有问题的对象http://pastebin.com/H2ea0W6A

【问题讨论】:

你能否将数据分离成一个 bean 发送到服务器,另一方面有一个对象与客户端和服务器之间共享的逻辑? 【参考方案1】:

您实际上可以使用@Category:https://code.google.com/p/google-web-toolkit/wiki/AutoBean#Categories

逻辑 放入 AutoBeans

但它不适用于您的 setKWHRgetKWHR(至少如果命名为属性访问器)。

将这些方法从 Energy 类中移出以将其仅保留为 DTO 可能会更容易。 或者,将这样的 DTO(至少在客户端,DTO 是 AutoBean)包装到另一个可以带来逻辑的对象中(并简单地将 getMMBTUgetDisplayUnit 委托给包装的 DTO)。

或者使用Piriti之类的东西在客户端进行反序列化,而不是使用AutoBeans;或将您的 AutoBean 数据复制到 Energy 实例中。

【讨论】:

很公平,尽管这正是我所担心的:没有办法在“幕后”做这件事,而且在需要这些额外方法的任何时候都需要额外的代码(或者调用它) ,或以某种方式复制/包装数据) 我之前研究过@Category,它非常麻烦,因为它需要为我们想要使用的每种类型创建工厂(而不是所有类型共享的单个工厂)

以上是关于在客户端和服务器之间共享 GWT 类实现的主要内容,如果未能解决你的问题,请参考以下文章

在 2 个 GWT 项目之间共享 RemoteService 实现

在共享包中使用 GWT 的 NumberFormat 类

GWT JPA - 无法反序列化响应

拦截 GWT RPC 的异步代理服务异常

在与 GWT Module Base 不同的上下文中调用 GWT 服务?

在 GWT 中,我们如何在 javascript 和 java 之间共享对象?