为什么静态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)看来,它是这样的:
- 您创建了一些
class(dto=数据传输对象)myapp.shared.dto.MyClass
- 您可以在其中添加一些静态字段,这些字段仅表示这些对象的集合(可能还有一些其他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应用程序像桌面应用程序一样编程。)