2012-12-19 33 views
1

ConfigProperty.idPropertyMap在服務器端填充。 (通過日誌輸出驗證)
在客戶端訪問它顯示爲空。爲什麼靜態GWT字段沒有傳輸到客戶端?

這是一些默認行爲:-((通過日誌輸出驗證)?(我不這麼認爲) 也許是相關的內部類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 /網絡)的用戶,它看起來是這樣的:

  • 你創造一些myapp.shared.dto.MyClass類(DTO =數據傳輸對象)

  • 你在裏面添加一些靜態字段這只是代表那些對象的集合(也許有些其他的DTO)

  • ,你也可以做到這一點在客戶端和所有其他的靜態方法以及工作

  • 不工作

    唯一的事情是同步的(這是不是SOOO壞擺在首位)

但是:一些提供註解,讓我們說@Transfer static Collection<MyClass> myObjList;會派上用場,因爲我似乎知道的影響和利益,這將帶來。

在我的情況下,它很簡單,因爲客戶端更加靜態,但是如果GWT框架能夠做到這一點,我們希望沒有明確地實現它。

+0

將'protected ... idPropertyMap'改爲'public ...'沒有幫助。 –

+0

btw。我正在使用GWT 2.5.0,運行時代碼與JRE 6兼容,jre7x64bit上的內部Jetty,64位jre7x64bit JVM上的Eclipse Juno 64bit,Win7 64bit –

+0

您可以將您的評論添加到原始文章中。 – Artemix

回答

1

靜態變量純粹是類變量它與單個實例無關。序列化僅適用於對象。

所以,你越來越總是空的一個ConfigProperty.idPropertyMap

+0

非常感謝。你知道這樣的事情是否被認爲實施?由於JavaScript支持某種靜態方法/字段,因此應該可以 - 不考慮其他潛在問題。 –

+0

我還想在此提及,通過Googleing很難在文檔中找到該事實!這對我來說並不是那麼明顯,因爲靜態方法可用於雙方。 –

+1

它們可用於每一方,但與其他任何發送數據的方法一樣,它們不會通過線路傳播 - 查看JSON或Java Beans的消息傳遞系統,您會發現這並不罕見。 –

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 
} 

但是請注意,它只能是將共享一個實例 - 如果別的服務器上有新的變化那場,這要求一個副本的所有客戶端都需要更新

+0

我會爭辯說,實施的RPC想法完全是這樣的。但我理解當然的侷限性。我的意思是所有的JRE仿真類都是「想法」的證明。 –

+1

原理是隻發送對象,而不是全局數據 - 靜態字段不是任何一個對象的一部分,所以不能發送。考慮如果我從RPC下載MyData,從我的應用程序中的幾個地方引用masterKey,然後加載了不同的MyData,並且服務器更改了masterKey - 應用程序的所有其他部分是否奇蹟般地知道該值已更改,會發生什麼?看看JSON如何爲JS應用程序工作 - 當單個對象獲得更新時,它不會修改全局變量。 –

+0

Thx Colin。如果你堅持既定的觀點 - 這可能是正確的方式來看待它,這是有道理的。當人們退後一步忘記過去有哪些原因時,你可能會看到一切工作方式不同。 (含義:如果程序員意識到這種影響,「嘗試」(自動)同步客戶端和服務器之間的靜態字段也是有意義的,這可以降低客戶端和服務器之間「隱藏」處理的複雜性。進一步發展,使網絡應用程序像桌面應用程序一樣進行編程。) –

相關問題