2011-05-15 35 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); 
} 

因此,应用在春分运行!