2011-09-30 41 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

相關問題