从GWT 2.7更新到2.8.1后不兼容的RemoteServiceException

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从GWT 2.7更新到2.8.1后不兼容的RemoteServiceException相关的知识,希望对你有一定的参考价值。

将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*")))
...

并添加不同的MyClassList<MyClass>。然后将其中两个列表添加到地图中并返回:

Map<String, List<MyClass>> map = new HashMap<>();
map.put("A", a);
map.put("B", b);
return map;

这仅在编译后在服务器上发生。在SuperDevMode中一切正常。任何的想法?

我已经删除了类和部署文件夹,做了一个项目+ gwt-unit-cache clean并多次重新编译项目,但异常仍然发生。

我也想知道为什么异常显式记录了字符串path哪个应该可以序列化而没有问题?!

答案

原因是在版本2.8.1的新gwt-servlet.jar旁边的WEB-INF/lib文件夹中的旧版gwt-servlet.jar和另一个名称。由于第一眼看上去并不明显。令人尴尬,但也许它会提醒别人仔细检查......

以上是关于从GWT 2.7更新到2.8.1后不兼容的RemoteServiceException的主要内容,如果未能解决你的问题,请参考以下文章

在GWT 2.7中使用SuperDevMode时如何获得完整的StackTrace?

GWT 2.7 + GAE 应用程序在部署时寻找代码服务器

GWT 2.7 超级开发模式不适用于 CssResource.style=obf

GWT 2.7:-XjsInteropMode JS 和 -XjsInteropMode CLOSURE 有啥区别?

在 GWT 2.7 中使用 SuperDevMode 时如何获取完整的 StackTrace?

尝试将 GET 项目从 2.5.1 升级到 2.8.1