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

时间:2012-12-19 13:36:06

标签: gwt

服务器端填写

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

这是一些默认行为吗? (我不这么认为) 该问题可能与内部类ConfigProperty.IdPropertyMapjava.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 
        {
            ...
        }
    }

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

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

只是我的观点(对于GWT来说是一个堕落的新人: - )):

我理解非常好(不完美!;-))“全局”变量同步的可能含义(依赖图或注释的使用可能是有用的)。 但是从一个新的(经验丰富的Java EE / web)用户看来是这样的:

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

  • 你在其中添加一些静态字段,只代表那些对象的集合(可能还有其他一些DTO)

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

  • 唯一不起作用的是同步(首先不是太糟糕)

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

在我的情况下,它相当简单,因为客户端更加静态,但是如果GWT框架可以做到这一点,我希望没有明确地实现它。

2 个答案:

答案 0 :(得分: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
}

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

答案 1 :(得分:1)

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

因此,您将始终清空ConfigProperty.idPropertyMap