Мы пытаемся интегрировать веб-приложение, работающее на Apache Tomcat 8.5.3, с Apache ServiceMix 7.0.1, используя мост Apache Felix (org.apache.felix.http.bridge-4.0.0.jar). Все шаги, перечисленные здесь, выполнены http://felix.apache.org/documentation/subprojects/apache-felix-http-service.html
Но теперь мы получаем ошибку 503 Service unavailable.
При отладке мы определили, что эта ошибка возникает через org.apache.felix.http.proxy.ProxyServlet (org.apache.felix.http.proxy-3.0.2.jar)
final HttpServlet dispatcher = this.tracker.getDispatcher();
if (dispatcher != null) {
final HttpServletRequest r = (this.servletContext == null ? req : new BridgeHttpServletRequest(req, this.servletContext));
dispatcher.service(r, res);
} else {
res.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
}
Теперь причина «диспетчер» равна нулю, потому что в трекере (org.apache.felix.http.proxy.DispatcherTracker) он не устанавливается.
@Override
public Object addingService(ServiceReference ref)
{
Object service = super.addingService(ref);
if (service instanceof HttpServlet) {
setDispatcher((HttpServlet)service);
}
return service;
}
Итак (экземпляр службы HttpServlet) возвращается как false. Мы проследили происхождение «службы» и обнаружили, что она находится в классе org.apache.felix.http.bridge.jar - org.apache.felix.http.bridge.internal.BridgeActivator. 'service' создается как анонимный дочерний класс HttpServlet, поэтому instanceof должен быть истинным.
Одно наблюдение - я заметил, что загрузчики классов для этих двух классов разные.
Загрузчик классов для службы - org.eclipse.osgi.internal.loader.EquinoxClassLoader (поскольку он загружается внутри пакета OSGI) Загрузчик классов для HttpServlet - это java.net.URLClassLoader.
Может ли это быть причиной того, что instanceof возвращается как false? Если да, то как решить эту проблему?
Любая помощь высоко ценится. Заранее спасибо.





Проблема решена путем выполнения следующих действий:
Добавлены javax.servlet; javax.servlet.http; version = 3.1.0 в системные пакеты OSGi (свойство org.osgi.framework.system.packages в config.properties)
Добавлен javax.servlet-api-3.1.0.jar в папку lib \ ext ServiceMix.
При добавлении в системные пакеты класс HttpServlet был экспортирован через System Bundle из загрузчика классов фреймворка, и instanceof вернул true.