2011-09-30 117 views
7

我在Glassfish 3.0.1上部署GWT 2.4应用程序。我可以很容易地通过http://host:PORT/appContext/
访问我的应用程序。然而,当我反向代理与Apache的应用程序,我出现以下摘录异常(从Glassfish的原木):反向代理对GWT应用程序有什么影响?

异常而调度传入RPC调用 com.google。 gwt.user.client.rpc.SerializationException: 类型'com.ozdokmeci.basicgwtproject.shared.GroupData'不能分配给'com.google.gwt.user.client.rpc.IsSerializable',并且没有自定义字段串行器。 为了安全起见,这种类型不会被序列化。

实现IsSerializable解决如在related question建议由Chi问题。 在相关问题中还有其他解决方法。

我的问题是这个问题的根本原因是什么,以及两个看起来不相关的解决方案(实现标记接口和扩展servlet类)如何解决这个问题? related question中提到的两种方法都有什么缺点?

注意:如果直接到达应用程序,则不会发生异常。

注2:与异常相关的类已经实现了Serializable接口,就GWT而言,它应该等价于IsSerializable接口。

+0

您确定只有在通过Apache访问时才会发生异常 - 您需要检查该假设。我认为即使直接访问它也会发生错误。这个例外与逆向代理无关。 – gkamal

+0

只有在代理Apache后面才会发生异常(我并不是建议Apache引起它)。当我直接访问应用程序时,不会发生此类异常。这不是假设,我在发布问题之前不止一次检查了日志。我知道这个异常与反向代理没有直接关系,这就是为什么我问这个问题:) – Kaan

+0

我认为还有其他问题 - 当你说非apache是​​hosts/devmode或访问编译的js版本。你能否检查两者是否运行相同版本的代码(缓存,不适当的构建等被排除)。在主页上进行一些可见的更改,并检查更改是否通过apache代理显示。 – gkamal

回答

3

我有完全相同的问题,当我追溯源代码时,发现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> 

希望我的建议至少点有人在正确的方向之上。 请让我们知道,如果有人实现这一点,它的作品。

+0

你的解决方案很好。如果你能详细说明底层原因(相对目录?)或者概述GWT序列化的结构(如果你知道的话),这对其他人会有好处。谢谢 – Kaan

+0

@Kaan - 好的,我已经更新了一些更详细的解决方案。 。我还没有实现这个,所以请尝试一下,让大家知道它是否有效! – jasop

+0

@jsop - 感谢您的更新,不错的建议和指针。我将无法尽快尝试。在此之前接受答案。 – Kaan

相关问题