如何修复多项目 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 是不是“太大”?

gwt rpc 中的 http 错误代码

如何在客户端到达 OnFailure() 之前处理 RPC 失败错误?在 GWT

GWT RPC“未找到 404”错误。如何让 RPC 在您自己的 Apache 服务器上工作?

如何在 GWT RPC 中将异常从服务器传递到客户端

GWT Servlet 错误 com.google.gwt.user.client.rpc .StatusCodeException: Tomcat 服务器上的 404