gwt序列化策略托管模式不同步

在托管模式下运行我的GWT应用程序(gwt 2.0.4)时,调用在远程Tomcat上运行的RPC方法,我得到GWT序列化exception:

INFO: GwtRpcEventSrvc: ERROR: The serialization policy file '/84EC7BA65AF8175BAA99B47877FDE163.gwt.rpc' was not found; did you forget to include it in this deployment? SEVERE: GwtRpcEventSrvc: WARNING: Failed to get the SerializationPolicy '84EC7BA65AF8175BAA99B47877FDE163' for module 'http://host:19980/MYAPP/'; a legacy, 1.3.3 compatible, serialization policy will be used. Youmay experience SerializationExceptions as a result. SEVERE: Exception while dispatching incoming RPC call Throwable occurred: com.google.gwt.user.client.rpc.SerializationException: java.lang.reflect.InvocationTargetException .at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeWithCustomSerializer(ServerSerializationStreamWriter.java:760) .at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.java:723) .at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:612) .at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:129) .at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter$ValueWriter$8.write(ServerSerializationStreamWriter.java:152) ... Caused by: com.google.gwt.user.client.rpc.SerializationException: Type 'com.mypackage.data.MyData' was not assignable to 'com.google.gwt.user.client.rpc.IsSerializable' and did not have a custom field serializer.For security purposes, this type will not be serialized.: instance = com.mypackage.data.MyData@1b061b06 .at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:610) .at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:129) .at com.google.gwt.user.client.rpc.core.java.util.Collection_CustomFieldSerializerBase.serialize(Collection_CustomFieldSerializerBase.java:43) .at com.google.gwt.user.client.rpc.core.java.util.LinkedList_CustomFieldSerializer.serialize(LinkedList_CustomFieldSerializer.java:36) .... 33 more 

托管模式生成序列化策略文件(* .gwt.rpc),其中包含与GWT编译期间创建的md5不同的md5 – 这些文件部署在我的服务器上。 GWT缺少托管模式客户端想要的序列化策略文件。

在非托管模式下运行时一切都很好。

我试图通过Ant或Eclipse调试配置启动托管模式,结果相同。 GWT编译类路径和托管模式类路径(包括)是相同的。

GWT编译Ant脚本:

                        

托管模式启动 – Ant脚本:

                                    

RPC方法签名:

 public List getSmpeWorkDddefZonesData(String processId); 

MyData定义(在ProjectE中声明为非GWT项目 – 数据层):

 package com.mypackage.data; import java.io.Serializable; public interface MyData extends Serializable {... 

MyData链接在从另一个GWT模块inheritance的模块中: com.mypackage.Data.gwt.xml

    

主模块com.myapp.Main.gwt.xml

 ...  ... 

如何使托管生成相同的序列化策略文件?

我一直有同样的问题。 我看到的唯一解决方案是确保两边都有相同的.gwt.rpc文件。

这意味着,每次启动或重新加载开发模式时,都必须使用新生成的文件替换Web服务器上部署的旧.gwt.rpc文件。

或者将开发模式战争输出目录指向Web服务器上下文。 并确保Web服务器已启用自动部署。 因此,每次通过开发模式更改文件时,Web服务器都会自动重新加载文件。

根据我在com.google.gwt.user.rebind.rpc.ProxyCreator看到的内容,GWT按其内容(md5)生成序列化策略.gwt.rpc文件的名称。

因此,出于某种原因,超级开发模式中的序列化策略与正常构建期间生成的序列化策略不同。

以下方法为我解决了这个问题:

  1. 打开为常规构建生成的序列化策略.gwt.rpc文件
  2. 打开为Super Dev Mode生成的序列化策略.gwt.rpc文件。 您可以通过查看Super Dev Mode启动时打印的工作目录找到它的位置。 例如,在我的情况下,它是:“workDir:C:\ Users \ your_user \ AppData \ Local \ Temp \ gwt-codeserver-5658052675265790575.tmp”
  3. 比较这两个文件 – 这可以给你一个很好的暗示,问题可能在哪里。 在我的情况下,2个不需要的类型被添加到序列化策略中,我可以完全从项目中删除它们。
  4. 修复差异后, .gwt.rpc文件名应该再次相同,问题将得到解决:)