2011-05-15 34 views
0

我正在嘗試將GWT和OSGi(Equinox)集成爲爲我的模塊化系統的其餘部分提供基於Web的UI。到目前爲止,我已經設法將GWT servlet嵌入到OSGi模塊中。嘗試將GWT整合到OSGi包中

我正在使用由GWT插件生成的GWT示例代碼項目,它由3個包組成:客戶端,服務器和共享。服務器包中的類(ui.server.GreetingServiceImpl)實現客戶機包(ui.client.GreetingService)中的接口,並且它們全部位於同一個包中。

當我試圖讓從客戶端網頁中的遠程過程調用我的錯誤:

IncompatibleRemoteServiceException: Could not locate requested interface 'ui.client.GreetingService' in default classloader

我推測,該類不是由類加載器找到,但我不知道如何解決這個問題。我可以通過要求或導入它們來訪問其他包中的類,但不能訪問與實現類位於同一包中的接口。任何人都可以將我指向正確的方向嗎?我一直在Google上搜索幾個小時。

回答

0

IncompatibleRemoteServiceException表示來自GUI的RPC調用未找到由@RemoteService註釋指定的接口。

你可以發佈你的項目的源代碼?

順便說一句,你也可以看看這個項目: http://code.google.com/p/gwt-in-osgi/

+0

感謝您的回覆。我設法讓它工作,事實證明我有一個循環依賴,我沒有意識到,該接口是從包外部訪問,包含包裝的GWT罐子的包。我通過向我的ui bundle的清單文件添加一個'Eclipse-RegisterBuddy:GWT-bundle'行,並向GWT bundle的清單添加一個'Eclipse-BuddyPolicy:registered'行來修復它。我會看看你鏈接的那個項目。 – clangenhoven 2011-05-17 09:53:17

2

這是需要在您的GreetingServiceImpl從HttpServlet的覆蓋方法「服務」:

@Override 
protected void service(HttpServletRequest req, HttpServletResponse resp) 
     throws ServletException, IOException { 
    // Cache the current thread 
    Thread currentThread = Thread.currentThread(); 
    // We are going to swap the class loader 
    ClassLoader oldContextClassLoader = 
    currentThread.getContextClassLoader(); 
    currentThread.setContextClassLoader(this.getClass().getClassLoader()); 
    super.service(req, resp); 
    currentThread.setContextClassLoader(oldContextClassLoader); 
} 

因此,應用在春分運行!