3

我正在尝试使用 OSGi HTTP 服务的 Felix 实现来启动 Wicket 应用程序,为此我只需使用WicketServletwithapplicationClassName参数注册服务:

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

我还尝试使用 Felix Whiteboard 实现并将 Web 服务注册为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以控制应用程序的实例化吗?或者也许使用应用程序工厂?

更新:或者也许使用应用程序工厂?

我试图将参数设置applicationFactoryClassNameContextParamWebApplicationFactory.class.getName()它并没有帮助,仍然无法使用 felix 并使用 Equinox。

欢迎任何光线。

4

1 回答 1

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

MyWicketFilter 的代码:

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

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

于 2010-03-18T22:48:24.927 回答