Exception while dispatching incoming RPC call
com.google.gwt.user.client.rpc.SerializationException:
Type ‘com.ozdokmeci.basicgwtproject.shared.GroupData’ 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.
实施IsSerializable解决了0700在related question中建议的问题.
相关问题中还有其他解决方法.
我的问题是这个的根本原因是什么,以及两个看似无关的解决方案(实现标记接口和扩展servlet类)如何解决这个问题?对于related question中提到的两种方法,还有任何缺点吗?
注意:如果直接联系应用程序,则不会发生异常.
注2:与异常相关的类已经实现了Serializable接口,就GWT而言,它应该等同于IsSerializable.
我有完全相同的问题,当我追溯源代码时,我发现反向代理时没有找到GWT序列化文件的目录(我认为因为该目录是一个相对路径).这就是为什么即使您已经实现了IsSerializable,也会获得序列化异常.我的解决方案最终是为我的RPC转移到宁静的JSON.使用JSON将允许您反向代理,因为它不需要查找这些序列化文件.
编辑
如果你仍想使用GWT RPC,我知道它是如何可能的(虽然我自己没有实现它).
首先,看看有关这些rpc文件的GWT帮助:
https://developers.google.com/web-toolkit/doc/2.4/DevGuideCompilingAndDebugging#key_application_files
你会注意到它说:
The serialization policy file must be accessible by your RPC RemoteServiceServlet via the ServletContext.getResource() call
因此,您需要覆盖RemoteServiceServlet并重新指向rpc(序列化策略)文件的位置.
以下是一个建议,取自本网站:http://code.google.com/p/google-web-toolkit/issues/detail?id=4817
public class MyRemoteServiceServlet extends RemoteServiceServlet { ... @Override protected SerializationPolicy doGetSerializationPolicy( HttpServletRequest request, String moduleBaseURL, String strongName) { //get the base url from the header instead of the body this way //apache reverse proxy with rewrite on the header can work String moduleBaseURLHdr = request.getHeader("X-GWT-Module-Base"); if(moduleBaseURLHdr != null){ moduleBaseURL = moduleBaseURLHdr; } return super.doGetSerializationPolicy(request, moduleBaseURL, strongName); } ...
在apache配置中添加:
ProxyPass /app/ ajp://localhost:8009/App-0.0.1-SNAPSHOT/ <Location /app/> RequestHeader edit X-GWT-Module-Base ^(.*)/app/(.*)$$1/App-0.0.1-SNAPSHOT/$2 </Location>
希望我上面的建议至少指出某人正确的方向.如果有人实现此功能,请告诉我们.