我有完全相同的問題,當我追溯源代碼時,發現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