将我的GWT 2.7应用程序更新为GWT 2.8.1后,我收到以下异常:
com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException: The response could not be deserialized
Caused by: com.google.gwt.user.client.rpc.SerializationException: /my/path/to/a/file.pdf
。此路径存储在路径变量MyClass
:
import java.util.ArrayList;
import java.util.List;
import com.google.gwt.user.client.rpc.IsSerializable;
public class MyClass implements IsSerializable {
private Integer id;
private String name;
private String path;
private List<String> assetClasses = new ArrayList<>();
private List<String> keywords = new ArrayList<>();
private List<Integer> regions = new ArrayList<>();
public ReportLink() {
// Empty default constructor for GWT serialization.
}
...getters + setters following
}
正如您所见,我正在实施IsSerializable
。此外,我有一个空构造函数(这可能是此异常的最常见原因;-))并且该类位于共享文件夹中(在* .gwt.xml中引用)。
我从数据库查询中设置了这样的数据:
myClass.setName(resultSet.getString("name"));
myClass.setPath(resultSet.getString("path"));
String keywords = resultSet.getString("keywords");
myClass.setKeywords(Arrays.asList(keywords.split("\\s*,\\s*")))
...
并向MyClass
添加不同的List<MyClass>
。然后将其中两个列表添加到地图中并返回:
Map<String, List<MyClass>> map = new HashMap<>();
map.put("A", a);
map.put("B", b);
return map;
这仅在编译后在服务器上发生。在SuperDevMode中一切正常。有什么想法吗?
我已经删除了类和部署文件夹,做了一个项目+ gwt-unit-cache clean并多次重新编译项目但是异常仍然发生。
我还想知道为什么异常显式记录了应该可以序列化的字符串path
而没有问题?!
答案 0 :(得分:3)
原因是gwt-servlet.jar
的旧版本在WEB-INF/lib
文件夹中的另一个名称旁边,版本为2.8.1的新gwt-servlet.jar
。由于第一眼看上去并不明显。令人尴尬,但也许它提醒别人要仔细检查......
答案 1 :(得分:0)
我遇到了同样的问题,只是将Serializable添加到枚举(实现接口)并添加没有参数的构造函数,就是这样...