2012-06-21 50 views
3

我正在遷移OSGi(Equinox)和Pax-web上運行的現有GWT應用程序,以使用聲明式服務而不是程序式服務跟蹤器。使用聲明式服務在OSGi + Pax-Web中GWT的問題

我在Equinox中使用Pax-Web。基於WAR的GWT應用程序通過PAX-WEB War extender加載沒有問題,但是您無法使用聲明式服務進行此操作。

我成功地將所有servlet重構出戰爭並將它們轉換爲聲明式OSGi服務(<provide interface="javax.servlet.Servlet"/>)。這樣我擺脫了Servlet中所有混亂的ServiceTracker代碼和特定的OSGi依賴關係。 我進一步複製了所有其他的web.xml功能註冊一個過濾器,服務靜態內容和歡迎頁面使用的信息[1]

在這一點上,它通常應該工作, GWT嘗試加載資源的方式:

加載序列化描述符時,GWT從本地上下文加載序列化策略文件。 在我的情況下,它試圖解決這樣的資源:/ctx/ctx/62394587E47773FB1594FF.gwt.rpc 這個資源是由GWT編譯器創建並劃歸: /戰/ CTX/CTX /資源...

之前,使用標準wab映射(Webapp-Context: /ctx, Webapp-Root: /war)gwt會正確地找到它的資源。 現在,我使用的編程資源映射:

DefaultResourceMapping resourceMapping = new DefaultResourceMapping(); 
resourceMapping.setAlias("/ctx"); 
resourceMapping.setPath("/war"); 

GWT無法加載種源,併產生以下錯誤:

2012-06-20 12:46:36.283:INFO:/:AbcProxy: ERROR: The serialization policy file '/ctx/ctx/600000000000000773FB1594FF.gwt.rpc' was not found; did you forget to include it in this deployment? 
2012-06-20 12:46:36.283:INFO:/:AbcProxy: WARNING: Failed to get the SerializationPolicy '600000000000000773FB1594FF' for module 'https://localhost:8443/ctx/ctx/'; a legacy, 1.3.3 compatible, serialization policy will be used. You may experience SerializationExceptions as a result. 

[注:最後一句應該是「你將經歷一系列序列化問題」]

我已經跟蹤問題到HttpServiceContext加載資源,並將路徑解釋爲文件而不是作爲相對於URL的URL編程網絡方面:

getting resource: [/mx/mx/6ECAD5B3A6F908CE17E47773FB1594FF.gwt.rpc] 
HttpServiceContext | not a URL or invalid URL: [/ctx/ctx/600000000000000773FB1594FF.gwt.rpc], treating as a file path 
DefaultHttpContext | Searching bundle [bundle] for resource [/ctx/ctx/600000000000000773FB1594FF.gwt.rpc] 

這顯然失敗了,因爲這樣的資源位於/捆綁文件系統戰/ CTX/CTX /。 這似乎涉及到錯誤PAXWEB-314 [2],它的實現是把相對路徑到一個文件路徑:

// IMPROVEMENT start PAXWEB-314 
257    try { 
258     resource = new URL(path); 
259     LOG.debug("resource: [" + path + "] is already a URL, returning"); 
260     return resource; 
261    } 
262     catch (MalformedURLException e) { 
263      // do nothing, simply log 
264      LOG.debug("not a URL or invalid URL: [" + path + "], treating as a file path"); 
265    } 
266    // IMPROVEMENT end PAXWEB-314 

有沒有辦法來解決這個問題?有人使用OSGi DS而不是WAB使用GWT和PAX-WEB? 一種可能的方法是將GWT編譯器生成的/ war/ctx複製回/ ctx,但在進入黑客方向之前,我想找到一個體面的解決方案。

任何想法?

1 - https://github.com/ops4j/org.ops4j.pax.web/blob/master/samples/whiteboard/src/main/java/org/ops4j/pax/web/extender/samples/whiteboard/internal/Activator.java [2] - http://team.ops4j.org/browse/PAXWEB-314

+0

似乎在OSGi容器中使用時等存在與類加載和GWT的問題。這可能與您的問題有關。 [GWT Issue 1888](http://code.google.com/p/google-web-toolkit/issues/detail?id=1888)和[GWT OSGI on clazzes.org](http://svn.clazzes。 org/svn/gwt/tags/gwt-osgi-2.4.0.2 /)可能會令你感興趣。 – pauli

+0

@pauli謝謝。我按照PAX-WEB處理Web應用程序上下文的方式來追蹤問題。基本上,當你有一個war文件時,你可以將'Webapp-Context'設置爲。 GWT使用'String contextPath = request.getContextPath();'來構建編譯資源的位置,但是由於PAX-WEB沒有提供這個位置,所以GWT沒有找到它。我們通過手動將編譯的資源複製到'..'來解決這個問題 – maasg

回答

0

我做了一些進一步的挖掘。

在GWT,這是相關片負責裝載這些政策文件的代碼:[1]

protected SerializationPolicy doGetSerializationPolicy(
     HttpServletRequest request, String moduleBaseURL, String strongName) { 
    // The request can tell you the path of the web app relative to the 
    // container root. 
    String contextPath = request.getContextPath(); 
    String modulePath = null; 
    if (moduleBaseURL != null) { 
     try { 
     modulePath = new URL(moduleBaseURL).getPath(); 
     } catch (MalformedURLException ex) { 
     // log the information, we will default 
     log("Malformed moduleBaseURL: " + moduleBaseURL, ex); 
     } 
    } 
... 

我懷疑的contextPath是在這種情況下,潛在的候選人嫌疑。爲了測試這個理論,我部署了一個簡單的servlet來轉儲它的上下文。 我使用WAB(MANIFEST:Webapp-Context + web.xml)部署它。在此部署中,servlet報告: [getContextPath] - > [/ ctx]

然後,使用包含資源映射的編程激活器將部署更改爲OSGi-ds。 DefaultResourceMapping resourceMapping = new DefaultResourceMapping(); resourceMapping.setAlias(「/ ctx」); resourceMapping.setPath(「/ war」);

在這種情況下,servlet的報告: [getContextPath] - > []

翻譯成GWT問題 - >當GWT是部署一個WAB,發現其配置在/ CTX /應用程序,並當我使用編程資源映射時,它正在調查/ app,因此找不到它的資源。

底線: 在PAX-WEB中,Webapp-Context不等同於別名。別名不像Webapp-Context那樣填充ContextPath。

目前唯一的變通針對這種情況,就是讓構建複製GWT生成的文件下一層(消除了應用程序上下文路徑)

PS:從大同的Web繼阿希姆Nierbeck,在OSGi規範正在演變管理的應用-CTX問題:http://wiki.osgi.org/wiki/WebExperience

[1] http://code.google.com/p/google-web-toolkit/source/browse/trunk/user/src/com/google/gwt/user/server/rpc/RemoteServiceServlet.java?spec=svn5045&r=5045