GWT RPC属性空

问题描述:

在我的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

问题是我的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