2013-10-19 102 views
2

在我的GWT應用程序,必須跟蹤到我的休眠對象所做的更改,所以我有這個簡單的POJO來修改傳送到服務器端,在那裏他們將被記錄:GWT RPC屬性空

public class ModifiedValueReference implements Serializable { 
    private static final long serialVersionUID = 6144012539285913980L; 

    private Serializable oldValue; 
    private Serializable newValue; 

    public ModifiedValueReference() { 
     super(); 
    } 

    public ModifiedValueReference(Serializable oldValue, Serializable newValue) { 
     this(); 
     setOldValue(oldValue); 
     setNewValue(newValue); 
    } 

    public Serializable getOldValue() { 
     return oldValue; 
    } 

    public void setOldValue(Serializable oldValue) { 
     this.oldValue = oldValue; 
    } 

    public Serializable getNewValue() { 
     return newValue; 
    } 

    public void setNewValue(Serializable newValue) { 
     this.newValue = newValue; 
    } 

} 

的屬性oldValuenewValue的類型爲Serializable,因此可以存儲我的整數,字符串,日期和布爾值以及其他幾個Hibernate對象。 (:通過使用setFirstNameLog()代替下面setFirstName()例如):

跟蹤是通過使用記錄該變形例的特殊設置器方法來實現當ModifiedValueReference對象到達經由GWT RPC服務器側

public class Person { 

    private String firstname; 

    private Map<String, ModifiedValueReference> modifications = 
      new HashMap<String, ModifiedValueReference>(15); 

    public void addModification(String key, Serializable oldValue, Serializable newValue) { 
     if (key != null && !key.isEmpty()) { 
      modifications.put(key, 
        new ModifiedValueReference(oldValue, newValue)); 
     } 
    } 

    public void setFirstnameLog(String firstname) { 
     addModification("First Name", getFirstname(), firstname); 
     setFirstname(firstname); 
    } 

    public void setFirstname(String firstname) { 
     this.firstname = firstname;  
    } 
    public String getFirstname() { 
     return this.firstname; 
    } 
} 

,所述oldValuenewValue都是空的! 爲什麼?

這些字段在客戶端填充了字符串。在服務器端,它們不是空的,而是空的字符串。

+2

也許一些更多的代碼會有所幫助。也許是實際的服務調用和服務器端的實現。 – enrybo

+0

@enrybo感謝您的建議。由於該代碼正在工作,我在家裏做了一個示例GWT項目,試圖重現這個問題。我在家裏的代碼工作正常,所以我懷疑其他代碼在工作是造成這個問題。我們在工作中有休眠和吉利德,所以任何事情都可能導致這個問題。如果你願意,我可以發佈我現在寫的代碼。 – Churro

+0

@enrybo,我想通了。我沒有'修改'的setter,導致它不會被服務器端的GWT RPC重建。 – Churro

回答

1

問題是我的Person類中的modifications地圖沒有setter方法(例如:A setModifications(Map<String, ModifiedValueReference>)方法)。

因此,當通過RPC方法保存Person對象時,GWT RPC無法重建服務器端的地圖。

+0

這真的很奇怪,因爲GWT序列化不需要getter或setter。所有可以序列化的非最終非瞬態字段將被序列化。 – Strelok

+0

@Strelok,我也不這麼認爲,但是調用com.google.gwt.user的'com.google.gwt.user.server.rpc.impl.ServerSerializationStreamReader.deserializeClass(Class ,Object)'。 server.rpc.impl.ServerSerializationStreamReader.getSetters(類)'否則說。當我調試'com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(String)'後發生的所有事情時,我想通了。 – Churro

+0

謝謝!因爲缺少二傳手而浪費了很多時間! – Carcamano