Запуск веб-приложения Wicket с OSGi HTTP Service - PullRequest
3 голосов
/ 12 марта 2010

Я пытаюсь запустить приложение Wicket, используя реализацию Felix службы HTTP OSGi, для этого я просто регистрирую службу, используя WicketServlet с параметром applicationClassName:

props.put("applicationClassName", MainApplication.class.getName());
service = (HttpService)context.getService(httpReference);
service.registerServlet("/", new WicketServlet(), props, null);

Я также попытался использовать реализацию Felix Whiteboard и зарегистрировать веб-сервис как Servlet:

props.put("alias", "/");
props.put("init.applicationClassName", MainApplication.class.getName());
registration = context.registerService(Servlet.class.getName(), new WicketServlet(), props);

В обоих случаях происходит сбой при развертывании с использованием Pax Runner и Felix (mvn package install pax:run -Dframework=felix -Dprofiles=log,config), исключение, похоже, связано с ClassLoader:

[Jetty HTTP Service] ERROR org.apache.felix.http.whiteboard - Failed to register servlet
org.apache.wicket.WicketRuntimeException: Unable to create application of class es.warp.sample.HTTPLocalGUI.MainApplication
....
....
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
....
....

Я попытался экспортировать все в комплекте, и он делает то же самое.

Самое странное, что он отлично работает, если я разверну его с помощью Equinox (mvn package install pax:run -Dframework=felix -Dprofiles=log,config).

Кажется, это проблема с видимостью, но я не знаю, как это исправить, я что-то не так делаю? Стоит ли пытаться расширить WicketServlet, чтобы взять под контроль создание экземпляра приложения? Или, может быть, с помощью приложения Factory?

Обновление: или, может быть, с помощью приложения Factory?

Я попытался установить для параметра applicationFactoryClassName значение ContextParamWebApplicationFactory.class.getName(), но это не помогло, но по-прежнему не получалось с Феликсом и работал с равноденствием.

Любой свет приветствуется.

1 Ответ

6 голосов
/ 19 марта 2010

Проблема здесь в том, что Wicket, похоже, плохо загружает applicationClass . Я не смотрел на код, который делает это, но я подозреваю, что он использует загрузчик классов текущего потока.

Я сделал следующее, чтобы преодолеть это:

  1. Создайте свой собственный WicketFilter (называемый MyWicketFilter) и переопределите getClassLoader. Это возвращает this.getClass().getClassLoader().
  2. Зарегистрируйте MyWicketFilter в качестве службы фильтрации, которая будет подхвачена службой http доски.

Код для запуска активатора:

Hashtable<String, String> props = new Hashtable<String, String>();
props.put("pattern", "/.*");
props.put("init.applicationClassName", MyApplication.class.getName());

final MyWicketFilter service = new MyWicketFilter();
context.registerService(Filter.class.getName(), service, props);

Код для MyWicketFilter:

public final class MyWicketFilter
    extends WicketFilter
{
    @Override
    protected ClassLoader getClassLoader()
    {
        return this.getClass().getClassLoader();
    }
}

Вы также можете использовать WicketServlet, но это включает переопределение newWicketFilter и верните MyWicketFilter отсюда.

...