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 参考吗?的主要内容,如果未能解决你的问题,请参考以下文章
在 EditorGridPanel (gwt-ext) 中单击时选择文本