【问题标题】:Why are static GWT fields not transferred to the client?为什么静态 GWT 字段不传输到客户端?
【发布时间】:2012-12-19 13:36:06
【问题描述】:

ConfigProperty.idPropertyMap 在服务器端填写。 (通过日志输出验证)
在客户端访问它显示它是空的。 :-((通过日志输出验证)

这是一些默认行为吗? (我不这么认为) 问题是否可能与内部类ConfigProperty.IdPropertyMapjava.util.HashMap 的使用、序列化或某些字段访问修饰符问题有关?

感谢您的帮助

// 传输对象 公共类 ConfigProperty 实现 IsSerializable、Comparable { ... 静态公共类 IdPropertyMap 扩展 HashMap 实现 IsSerializable { ... } 受保护的静态 IdPropertyMap idPropertyMap = new IdPropertyMap(); ... } // 服务器服务 公共类 ManagerServiceImpl 扩展 RemoteServiceServlet 实现 经理服务 { ... 公共 IdPropertyMap getConfigProps(String timeToken) 抛出 ConfiguratorException { ... } }

在一些好的答案后从下面添加(谢谢!):

回答底线:目前未实现/支持静态字段同步。某人/我必须提交功能请求

只是我的观点(GWT 坠入爱河的新人 :-)):

我非常了解(不完美!;-))“全局”变量同步的可能含义(依赖图或注释的使用可能很有用)。 但对于一个新的(其他经验丰富的 Java EE/web)用户来说,它看起来像这样:

  • 您创建了一些myapp.shared.dto.MyClass 类(dto = 数据传输对象)

  • 您在其中添加一些静态字段,仅表示这些对象的集合(可能还有其他一些 DTO)

  • 您也可以在客户端执行此操作,所有其他静态方法也可以正常工作

  • 唯一不工作的是同步(首先这还不错)

但是:一些提供的注释,比如说@Transfer static Collection<MyClass> myObjList; 会很方便,因为我似乎知道这会带来的影响和好处。

在我的情况下,它相当简单,因为客户端更加静态,但如果 GWT 框架可以做到,则希望在不明确实现的情况下拥有这些数据。

【问题讨论】:

  • protected ... idPropertyMap 更改为 public ... 没有帮助。
  • 顺便说一句。我正在使用 GWT 2.5.0,运行时代码与 JRE 6 兼容,jre7x64bit 上的内部 Jetty,64bit jre7x64bit JVM 上的 Eclipse Juno 64bit,Win7 64bit
  • 您可以将您的 cmets 添加到原始帖子中。
  • @Artemix:就是这样做的。谢谢

标签: gwt


【解决方案1】:

静态变量是纯类变量,与单个实例无关。序列化仅适用于对象。

所以,你总是得到一个空的 ConfigProperty.idPropertyMap

【讨论】:

  • 非常感谢。你知道这样的事情是否被认为是实施的?由于 JavaScript 支持某种静态方法/字段,它应该是可能的 - 不考虑其他潜在问题。
  • 我还想在这里提一下,通过谷歌搜索很难在文档中找到这个事实!这对我来说不是那么明显,因为静态方法在双方都可用。
  • 它们在每一侧都可用,但就像任何其他发送数据的方法一样,它们不会通过网络传输 - 查看 JSON 或 Java Bean 的消息传递系统,您会发现这并不罕见。
  • 其实我从来没有试过这个,但是你想在序列化过程中保留 ConfigProperty.idPropertyMap 的值应该使用 private void readObject(ObjectInputStream) 和 private void writeObject(ObjectOutputStream) 显式保存和恢复这些值跨度>
  • 我不相信 ObjectOutputStream 可以在 GWT 项目中使用 - 客户端代码仅限于可以转换为 JavaScript 的类。
【解决方案2】:

RPC 的想法不是您可以将客户端和服务器视为完全相同的 JVM,而是它们可以共享您通过网络传递的对象。要通过线路从服务器发送静态字段到客户端,存储在该字段中的对象必须从 RPC 方法返回。

静态属性不会序列化并通过网络发送,因为它们不属于单个对象,而是属于类本身。

public class MyData implements Serializable {
    protected String name;//sent over the wire, each MyData has its own name
    protected String key;

    protected static String masterKey;//All objects on the server or client 
    // share this, it cannot be sent over RPC. Instead, another RPC method
    // could access it
}

但是请注意,只有一个实例将被共享 - 如果服务器上的其他内容更改了该字段,则所有请求副本的客户端都需要更新

【讨论】:

  • 我认为实现的 RPC 思想在某种程度上正是如此。但我当然理解这些限制。我的意思是所有的 JRE 仿真类都是“想法”的证明。
  • 原则是只发送对象,不发送全局数据——静态字段不属于任何一个对象,所以不能发送。考虑一下如果我从 RPC 下载 MyData,从应用程序的多个位置引用 masterKey,然后加载不同的 MyData,并且服务器更改了 masterKey,会发生什么情况——应用程序的所有其他部分是否应该以某种方式神奇地知道值已更改?看看 JSON 如何在 JS 应用程序中工作 - 当单个对象获得更新时,它不会修改全局变量。
  • 谢谢科林。如果你坚持既定的观点是有道理的——这也许是正确的看待它的方式。只是当一个人退后一步,忘记过去有哪些原因时,你可能会看到一切的运作方式不同。 (含义:如果程序员意识到其中的含义,那么在客户端和服务器之间“尝试”(自动)同步静态字段(以及)可能是有意义的。它可以降低“隐藏”客户端-服务器处理的复杂性在使网络应用程序像桌面应用程序一样编程的道路上走得更远。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2019-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多