2011-05-15 3 views
0

Я пытаюсь интегрировать GWT с OSGi (Equinox), чтобы предоставить веб-интерфейс для остальной части моей модульной системы. До сих пор мне удалось внедрить сервлет GWT в модуль OSGi.Попытка интегрировать GWT в пакет OSGi

Я использую проект кода кода GWT, созданный плагином Eclipse GWT, который состоит из 3 пакетов: клиент, сервер и общий. Класс в серверном пакете (ui.server.GreetingServiceImpl) реализует интерфейс в клиентском пакете (ui.client.GreetingService), и все они находятся в одном комплекте.

Когда я пытаюсь сделать удаленный вызов процедур с вебом-страницы на стороне клиента я получаю сообщение об ошибке:

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

я понимаю, что класс не был найден загрузчиком, но я не знаете, как это исправить. Я могу обращаться к классам в других пакетах, требуя или импортируя их, но не интерфейс, который находится в том же пакете, что и класс реализации. Может ли кто-нибудь указать мне в правильном направлении? Я работаю в течение нескольких часов.

ответ

0

IncompatibleRemoteServiceException означает, что вызов RPC из GUI не нашел интерфейс, указанный аннотацией @RemoteService.

Можете ли вы опубликовать свой проект с помощью исходников?

BTW вы также можете посмотреть на этот проект: http://code.google.com/p/gwt-in-osgi/

+0

Спасибо за ответ. Мне удалось заставить его работать, оказалось, что у меня была круговая зависимость, о которой я не знал, интерфейс был доступен извне пакета, с помощью пакета, содержащего завернутые баннеры GWT. Я исправил это, добавив строку 'Eclipse-RegisterBuddy: GWT-bundle' в файл манифеста ui bundle и строку« Eclipse-BuddyPolicy: зарегистрированная »в манифест GWT-пакета. Я посмотрю на этот проект, который вы связали. – clangenhoven

2

Это необходимо переопределить метод «службы» из HttpServlet на ваших GreetingServiceImpl:

@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); 
} 

Таким образом, приложение работает на Равноденствие !!