gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:37:36 29 4
gpt4 key购买 nike

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

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) 部署它时,它都失败了,异常似乎与类加载器:

[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)
....
....

我尝试导出 bundle 中的所有内容,结果也是如此。

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

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

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

我尝试将参数 applicationFactoryClassName 设置为 ContextParamWebApplicationFactory.class.getName() 但没有帮助,仍然无法使用 felix 并使用 equinox。

欢迎任何光线。

最佳答案

这里的问题是 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。

关于osgi - 使用 OSGi HTTP 服务启动 Wicket Web 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2432263/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com