EXT GWT BaseModel 需要有 DTO 参考吗?

Posted

技术标签:

【中文标题】EXT GWT BaseModel 需要有 DTO 参考吗?【英文标题】:EXT GWT BaseModel needs to have DTO reference? 【发布时间】:2012-08-17 08:13:05 【问题描述】:

我对 GWT 很陌生。 我正在使用 ext-gwt 小部件。

我发现我的办公室代码中有很多地方包含类似,

class A extends BaseModel

 private UserAccountDetailsDto userAccountDetailsDto = null;

 //SETTER & GETTER IN BASEMODEL WAY

此外,未使用 DTO 引用。

public class UserAccountDetailsDto implements Serializable

    private Long userId=null;
    private String userName=null;
    private String userAccount=null;
    private String userPermissions=null;

        //NORMAL SETTER & GETTER

现在,我可以从 GWT 服务器端代码中获取结果,并且一切正常,但是当我在 A 类中注释 DTO 引用时,我没有得到任何结果。

请解释我的需要。

谢谢

【问题讨论】:

【参考方案1】:

问题在于 GXT BaseModel 和 GWT-RPC 序列化的实现。 BaseModel 基于特殊的 GXT 地图 RpcMap。这个 map 定义了特殊的序列化规则,可以避免 RPC 类型爆炸,但是作为副作用,只有 map 中存储的一些简单类型会被序列化。例如。您可以将任何类型放入地图中,但如果您对其进行序列化/反序列化,则只会出现 Integer、String、Double、Byte、Float 和 Short(以及这种类型的数组)类型的值。所以在BaseModel中引用DTO的意义,就是告诉GWT-RPC这个类型也需要序列化。

详细解释

GWT-RPC 基本上是这样工作的:

当您为服务定义接口时,GWT-RPC 会分析参数/返回类型中使用的所有类,以创建序列化器/反序列化器。如果你从你的服务返回类似Map<Object,Object> 的东西,GWT-RPC 将不得不为每个实现 Map 和 Serializable 接口的类创建一个序列化器,但它也会为每个实现 Serializable 的类生成序列化器。最后这是一个相当糟糕的情况,因为你编译的 js 文件的大小会更大。这种情况称为 GWT-RPC 类型爆炸。

因此,在BaseModel 中,所有值都存储在RpcMap 中。并且RpcMap 有自定义编写的序列化程序(RpcMap_CustomFieldSerializer 如果您对如何创建此类东西感兴趣,可以查看它的代码),因此不会导致上述问题。但由于它有自定义序列化程序,GWT 不知道在RpcMap 中放入了哪个自定义类,并且它不会为它们生成序列化程序。因此,当您将某个字段放入您的 BaseModel 类时,gwt 知道它可能需要能够序列化此类,因此它将生成此类所需的所有内容。

【讨论】:

可能还值得指出的是,这都是 GXT 2 - 最新版本,GXT 3,不需要 BaseModel,可以使用普通的 Java bean。 是的,不要浪费时间考虑 GXT2,因为 GXT3 是要走的路。 好吧,解释对那些坚持使用 GXT 2 的人来说仍然有用。并不是所有现有的 GXT 2 项目都会神奇地升级到更新版本=)【参考方案2】:

使用 BaseModel 将 GXT2 应用程序代码移植到 GXT3 模型是一项艰巨的任务。使用 GXT3 的 ModelProviders 在模型方面或多或少会完全重写,提供一些灵活性。任何依赖模型事件、存储、记录等的代码都需要重写。

【讨论】:

以上是关于EXT GWT BaseModel 需要有 DTO 参考吗?的主要内容,如果未能解决你的问题,请参考以下文章

GWT RPC:DTO 与 DAO?

Gwt-rpc 仅使用 DAO。摆脱 DTO

gwt-ext 和 ext-gwt 的区别

在 EditorGridPanel (gwt-ext) 中单击时选择文本

GWT 没有可用于类型 [userClassName] 的源代码

Ext-GWT TreeGrid 间接调用了 GWT-RPC 回调?为啥?