使用OSGi HTTP服务启动Wicket Web应用程序

Jai*_*ano 3 osgi wicket httpservice embedded-jetty apache-felix

我正在尝试使用Felix实现的OSGi HTTP服务启动Wicket应用程序,因为我只是使用WicketServletwith applicationClassName参数注册服务:

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

我也尝试过使用Felix Whiteboard实现并将Web服务注册为Servlet一个:

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

在这两种情况下,当我使用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)
....
....
Run Code Online (Sandbox Code Playgroud)

我试图导出捆绑中的所有内容,它也是如此.

最奇怪的是,如果我使用Equinox(mvn package install pax:run -Dframework=felix -Dprofiles=log,config)部署它,它会完美运行.

这似乎是一个可见的问题,但我不知道如何解决它,我做错了什么?我应该尝试扩展WicketServlet以控制应用程序的实例化吗?或者也许使用应用程序工厂?

更新:或者可能使用应用程序工厂?

我尝试将参数设置applicationFactoryClassNameContextParamWebApplicationFactory.class.getName()它并没有帮助,仍然使用felix失败并使用equinox.

任何光线都欢迎.

Ste*_*vik 6

这里的问题是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);
Run Code Online (Sandbox Code Playgroud)

MyWicketFilter的代码:

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

您也可以使用WicketServlet,但这涉及覆盖 newWicketFilter并从此处返回MyWicketFilter.