如何修复多项目 GWT 设置中的 RPC 错误 IncompatibleRemoteServiceException?
Posted
技术标签:
【中文标题】如何修复多项目 GWT 设置中的 RPC 错误 IncompatibleRemoteServiceException?【英文标题】:How to fix RPC error IncompatibleRemoteServiceException in a multi-project GWT setup? 【发布时间】:2017-07-12 16:48:22 【问题描述】:我决定将我的客户端服务器 gwt 项目拆分为 3 个单独的 mvn 项目:
客户 服务器 共享共享组件包含所有模型类、Service 接口和 ServiceAsync 接口。该项目被声明为服务器和客户端 gwt 项目的依赖项。一切编译正常,客户端应用程序正常运行。 客户端也发出正确的 rpc 请求,但服务器响应:
com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException/3936916533","Type name elision in RPC payloads is only supported if the RPC whitelist file is used."
问题可能是什么?我应该在我的 servlet 实现中配置一些不同的东西吗?
【问题讨论】:
您如何运行(和/或打包和/或部署)您的应用程序? 我使用 maven 进行打包/部署 【参考方案1】:这意味着无论出于何种原因,您的 *.gwt.rpc
文件都无法加载(即它们不存在或可能无法通过其预期的 URL 访问)。这可能意味着你在拆分后弄错了他们的位置。
您收到的错误仅存在于名为com.google.gwt.user.server.rpc.impl.LegacySerializationPolicy
的类中,如果常规策略文件发生问题,则会加载该类。
来自 javadoc:
与 GWT 1.3.3 RPC 兼容的序列化策略。这是使用 当不存在序列化策略文件时。
在同一个类中,我们有:
private static final String ELISION_ERROR = "Type name elision in RPC "
+ "payloads is only supported if the RPC whitelist file is used.";
...还有类似的东西:
/**
* Implemented to fail with a useful error message.
*/
public final String getClassNameForTypeId(String id)
throws SerializationException
throw new SerializationException(ELISION_ERROR);
所以看起来这是故意的,尽管具有讽刺意味的是,错误消息并不是很有用。
您可以通过RemoteServiceServlet#loadSerializationPolicy
运行调试器,看看为什么它没有加载您期望的策略文件。
【讨论】:
你说得对,我缺少策略文件 (.rpc)。它们存在于我的服务器项目中,但不在客户端。通常的处理方式是什么?使用 web.xml 在客户端项目上重新生成或以某种方式重用来自服务器的项目? 我确保在包装过程中将它们放置在适当的位置。我不知道你是否可以单独生成它们。但是问题是什么,您是否将客户端/服务器模块部署在不同的服务器上? 正如我上面提到的,客户端和服务器是两个完全独立的项目/存储库,因此分别构建。尽管所有模型和服务都在另一个项目中,该项目被标记为客户端和服务器端的 mvn/gwt 依赖项。 如何构建并不重要,重要的是如何部署。我也单独构建模块,但将它们部署在同一台服务器上,因此我只需要一组序列化策略。请注意,服务器端 RPC 通过 servlet.getServletContext().getResourceAsStream(serializationPolicyFilePath) 加载资源。此外,如果您在 tomcat 上使用 apache 前端,并且公共 URL 与 tomcat 的不同,预计会遇到一些麻烦。 我做了一些测试,结果发现唯一阻碍它工作的是 RPC 有效负载中的 url...7|1|4|https://url.foo/bar|2A094F8DDEB|_|getClientConfigData|1|2|3|4|0|
。我更改为原始客户端使用的那个(在分离后端/前端之前)并且一切正常。我必须在新客户中找到一种方法来做到这一点。 (如果其中任何一个有意义的话)【参考方案2】:
可能是浏览器正在缓存 .nochache.js 文件。
编辑:
我只记得有一次发生这种情况。这是一个模糊的记忆...... servlet 在正确的路径上吗?客户端请求的网址是否正确?
模块 ModA 的服务在 deploy/ModA/rpcPolicyManifest/manifests 中查找。 Servlet 应该映射到 /ModA/service,客户端必须请求到http://example.com/webapp/ModA/service。
【讨论】:
确定,不涉及缓存。以上是关于如何修复多项目 GWT 设置中的 RPC 错误 IncompatibleRemoteServiceException?的主要内容,如果未能解决你的问题,请参考以下文章
如何知道一个对象对于 GWT 和 IE8 中的 RPC 是不是“太大”?
如何在客户端到达 OnFailure() 之前处理 RPC 失败错误?在 GWT
GWT RPC“未找到 404”错误。如何让 RPC 在您自己的 Apache 服务器上工作?
GWT Servlet 错误 com.google.gwt.user.client.rpc .StatusCodeException: Tomcat 服务器上的 404