如何修复多项目 GWT 设置中的 RPC 错误 IncompatibleRemoteServiceException?

How to fix RPC error IncompatibleRemoteServiceException in a multi-project GWT setup?

我决定将我的客户端服务器 gwt 项目拆分为 3 个独立的 mvn 项目:

共享组件包含所有模型 类、服务接口和 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 实现中配置不同的东西吗?

这意味着无论出于何种原因,无法加载您的 *.gwt.rpc 文件(即它们不存在或可能无法通过预期的 URL 访问)。这可能意味着你在拆分后弄错了他们的位置。

您收到的错误仅出现在名为 com.google.gwt.user.server.rpc.impl.LegacySerializationPolicy 的 class 中,如果常规策略文件出现问题,该错误将被加载。 来自 javadoc:

A serialization policy compatible with GWT 1.3.3 RPC. This is used when no serialization policy file is present.

在同一个 class 中,我们有:

  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 调试器,看看为什么它没有加载您期望的策略文件。

可能是浏览器正在缓存 .nochache.js 文件。

编辑:

我只记得这件事发生过一次。这是一个模糊的记忆...... servlet 在正确的路径上吗?客户端请求的是否正确 url?

模块 ModA 的服务在 deploy/ModA/rpcPolicyManifest/manifests 中查找。 Servlet 应映射到 /ModA/service,客户端必须请求到 http://example.com/webapp/ModA/service