为什么静态GWT字段没有传输到客户端?

为什么静态GWT字段没有传输到客户端?,gwt,Gwt,ConfigProperty.idPropertyMap在服务器端填写。(通过日志输出验证) 在客户端访问它表明它是空的:-((通过日志输出验证) 这是一种默认行为吗?(我不这么认为) 问题是否与内部类ConfigProperty.IdPropertyMap,java.util.HashMap使用、序列化或某些字段访问修饰符问题有关 谢谢你的帮助 // the transfer object public class ConfigProperty implements IsSerial

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

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

谢谢你的帮助

// the transfer object public class ConfigProperty implements IsSerializable, Comparable { ... static public class IdPropertyMap extends HashMap implements IsSerializable { ... } protected static IdPropertyMap idPropertyMap = new IdPropertyMap(); ... } // the server service public class ManagerServiceImpl extends RemoteServiceServlet implements ManagerService { ... public IdPropertyMap getConfigProps(String timeToken) throws ConfiguratorException { ... } } //转移对象 公共类ConfigProperty实现可序列化、可比较{ ... 静态公共类IdPropertyMap扩展了HashMap 可串行化 { ... } 受保护的静态IdPropertyMap IdPropertyMap=新IdPropertyMap(); ... } //服务器服务 公共类ManagerServiceImpl扩展了RemoteServiceServlet实现 管理服务 { ... 公共IdPropertyMap getConfigProps(字符串时间令牌) 抛出配置异常 { ... } } 在一些好的答案之后从下面添加(谢谢!):

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

只是我的观点(一个对GWT坠入爱河的新手:-):

我很好地理解了“全局”变量同步的可能含义(依赖关系图或注释的使用可能很有用)。 但是从一个新用户(其他有经验的Java EE/web)看来,它是这样的:

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

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

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

  • 唯一不起作用的是同步(一开始还不错)

但是:有些提供了注释,比如说
@Transfer静态集合myObjList会很方便,因为我似乎知道这将带来的影响和好处


在我的例子中,这非常简单,因为客户机更静态,但是如果GWT框架能够做到这一点,我希望在不明确实现它的情况下拥有这些数据。

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


因此,您的ConfigProperty.idPropertyMap总是空的。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
}

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

更改
保护。。。idPropertyMap
公共…
没有帮助。顺便说一句。我使用的是GWT 2.5.0,运行时代码与JRE 6兼容,jre7x64bit上的内部Jetty,64位jre7x64bit JVM上的Eclipse Juno 64位,Win7 64位。您可以在原始帖子中添加注释。@Artemix:就是这样做的。非常感谢你。你知道这样的事情是否会被考虑实施吗?由于JavaScript支持某种静态方法/字段,这应该是可能的——不考虑其他潜在问题。我还想在这里提到,通过谷歌搜索很难在文档中找到这一事实!这对我来说并不明显,因为静态方法在双方都是可用的。它们在双方都是可用的,但就像任何其他发送数据的方法一样,它们不会通过电线传输-看看JSON或Java Bean的消息传递系统,你会发现这并不罕见。实际上我从未尝试过这一点,但是,如果要在序列化过程中保留ConfigProperty.idPropertyMap的值,则应使用私有void readObject(ObjectInputStream)和私有void writeObject(ObjectOutputStream)显式保存和还原这些值我不相信
ObjectOutputStream
可以在GWT项目中使用-客户端代码仅限于可以转换为JavaScript的类。我认为实现的RPC思想在某种程度上正是如此。但我当然理解其局限性。我的意思是所有的JRE仿真类都是“想法”的证明。原则是只发送对象,而不是全局数据-静态字段不是任何一个对象的一部分,因此不能发送。考虑一下,如果我从我的应用程序中的几个地方从RPC下载了MyDATA,然后加载了不同的MyDATA,服务器改变了MaskKEY——如果应用程序的其他部分神奇地知道值已经改变了,会发生什么?看看JSON是如何为JS应用程序工作的——当单个对象得到更新时,它不会修改全局变量。如果你坚持既定的观点,这是有意义的——这也许是正确的看待方式。只是当一个人后退一步,忘记了过去有哪些原因时,你可能会看到所有事情的运作方式都不一样。(意思是:如果程序员意识到这一点,“尝试”在客户端和服务器之间(以及)自动)同步静态字段是有意义的。这可以降低“隐藏”客户端-服务器处理的复杂性,从而进一步使web应用程序像桌面应用程序一样编程。)