我正在Glassfish 3.0.1上部署GWT 2.4应用程序。我可以通过http://host:PORT/appContext/轻松访问我的应用程序。但是,当我使用Apache反向代理应用程序时,我会得到以下摘录的异常(来自Glassfish日志):
调度传入的RPC调用时发生异常 com.google.gwt.user.client.rpc.SerializationException: 类型“com.ozdokmeci.basicgwtproject.shared.GroupData”无法分配给“com.google.gwt.user.client.rpc.IsSerializable”,并且没有自定义字段序列化程序。 出于安全考虑,此类型不会被序列化。
实施IsSerializable
解决Chi中related question建议的问题。
相关问题中还有其他解决方法。
我的问题是这个的根本原因是什么,以及两个看似无关的解决方案(实现标记接口和扩展servlet类)如何解决这个问题? related question中提到的两种方法都有任何缺点吗?
注意:如果直接联系该应用,则不会发生异常。
注意2:与异常相关的类已经实现了Serializable接口,就GWT而言,它应该等同于IsSerializable。
答案 0 :(得分:4)
我有完全相同的问题,当我浏览源代码时,我发现反向代理时没有找到GWT序列化文件的目录(我认为因为该目录是一个相对路径)。这就是为什么即使你已经实现了IsSerializable,你也会得到序列化异常。
我的解决方案最终是为我的RPC转移到宁静的JSON。使用JSON将允许您反向代理,因为它不需要找到这些序列化文件。
修改强>
如果你仍想使用GWT RPC,我知道它是如何可能的(虽然我自己没有实现)。
首先,看看有关这些rpc文件的GWT帮助: https://developers.google.com/web-toolkit/doc/2.4/DevGuideCompilingAndDebugging#key_application_files
你会注意到它:
您的RPC RemoteServiceServlet必须可以通过ServletContext.getResource()调用访问序列化策略文件
因此,您需要覆盖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 config中添加:
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>
希望我上面的建议至少指出某人正朝着正确的方向前进。 如果有人实现此功能,请告知我们它是否有效。