我有完全相同的问题,当我追溯源代码时,发现GWT序列化文件的目录在反向代理(我认为是因为目录是相对路径)时未找到。这就是为什么即使你已经实现了IsSerializable,你也会得到序列化异常。
我最终的解决方案是转移到我的RPC安宁的JSON。使用JSON将允许您反向代理,因为它不需要查找这些序列化文件。
编辑
如果你想仍然使用GWT RPC不过,我有它是如何可能的想法(虽然我还没有实现它自己)。
首先来看看GWT帮助这些RPC文件: https://developers.google.com/web-toolkit/doc/2.4/DevGuideCompilingAndDebugging#key_application_files
你会发现它说:
序列化策略文件必须是通过ServletContext中的RPC RemoteServiceServlet访问.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的配置加:
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>
希望我的建议至少点有人在正确的方向之上。 请让我们知道,如果有人实现这一点,它的作品。
您确定只有在通过Apache访问时才会发生异常 - 您需要检查该假设。我认为即使直接访问它也会发生错误。这个例外与逆向代理无关。 – gkamal
只有在代理Apache后面才会发生异常(我并不是建议Apache引起它)。当我直接访问应用程序时,不会发生此类异常。这不是假设,我在发布问题之前不止一次检查了日志。我知道这个异常与反向代理没有直接关系,这就是为什么我问这个问题:) – Kaan
我认为还有其他问题 - 当你说非apache是hosts/devmode或访问编译的js版本。你能否检查两者是否运行相同版本的代码(缓存,不适当的构建等被排除)。在主页上进行一些可见的更改,并检查更改是否通过apache代理显示。 – gkamal