Спецификации: OSGi HTTP Whiteboard и ServletContextHelper

Мне нужна некоторая точность в отношении поведения ServletContextHelper, связанного со спецификацией Http Whiteboard, когда несколько пакетов используют один и тот же ServletContextHelper.

Спецификация говорит:

Реализация Http Whiteboard должна создать отдельный экземпляр ServletContext для каждой службы ServletContextHelper. Службы интерактивной доски можно связать с помощником контекста сервлета с помощью свойства osgi.http.whiteboard.context.select. Если это свойство не установлено, используется вспомогательная функция контекста сервлета по умолчанию.

Если я правильно понимаю, все сервлеты или фильтры, использующие одну и ту же ссылку ServletContextHelper, привязаны к одному и тому же «ServletContext».

Затем :

Некоторые реализации ServletContextHelper могут быть реализованы с использованием Service Factory, например, для предоставления ресурсов из связанного пакета, как это делает реализация по умолчанию. Поэтому реализация доски должна получить помощник контекста сервлета, используя контекст пакета пакета, в котором зарегистрирована служба доски.

Таким образом, если пакет A регистрирует сервлет с помощью ServletContextHelper X, а пакет B регистрирует фильтр с той же ссылкой на ServletContextHelper, то сервлет и фильтр регистрируются в одном и том же ServletContext, но их методы инициализации вызываются с двумя разными экземплярами ServletContext (чтобы реализовать методы getClassLoader() по-разному)?

Более того, каково поведение ServletContextHelper по умолчанию? всегда ли зарегистрирован ServletContextHelper по умолчанию? он распределяется между пакетами или есть только один экземпляр в пакетах?


person Jérémie B    schedule 21.07.2017    source источник


Ответы (1)


Я работаю над Pax Web 8, где я действительно хочу добиться правильного поведения.

140.2.7 Отношение к контейнеру сервлетов глава спецификации OSGi CMPN показывает картинку, где на самом деле есть три слоя javax.servlet.ServletContext объектов:

  • the ServletContext implementation specific to real Servlet container. In Pax Web it's one of:
    • org.eclipse.jetty.servlet.ServletContextHandler.Context
    • org.apache.catalina.core.ApplicationContext
    • io.undertow.servlet.spec.ServletContextImpl
  • реализация ServletContext в соотношении 1:1 с сервисом org.osgi.service.http.context.ServletContextHelper OSGi
  • ServletContext, который реализует контракт Service-Factory для каждого пакета Whiteboard, где все методы, кроме getClassLoader(), делегируют указанному выше SCH, а getClassLoader() возвращает bundle.adapt(BundleWiring.class).getClassLoader()

Проблема связана с принципом двойной ответственности, принятым в отношении org.osgi.service.http.context.ServletContextHelper. Он используется как для реализации функциональных аспектов (handleSecurity()), так и для аспектов разделения ресурсов (getResource()).

Итак, вы правы — если Bundle A регистрирует сервлет, а Bundle B регистрирует фильтр, оба будут использовать один и тот же экземпляр ServletContext (поддерживаемый указанным ServletContextHelper), но их init() методы будут предоставлены с другим, специфичным для пакета экземпляром ServletContext.

Это просто реализуется делегированием, есть две реализации:

  • org.ops4j.pax.web.service.spi.servlet.OsgiServletContext реализует поведение 1:1
  • org.ops4j.pax.web.service.spi.servlet.OsgiScopedServletContext реализует getClassLoader() и делегирует все остальные методы вышеуказанному OsgiServletContext
person Grzegorz Grzybek    schedule 19.02.2021
comment
Спасибо! Этот вопрос немного устарел, я задал его здесь на случай, если неправильно понял спецификацию, прежде чем писать о проблемах в JIRA :-) Я надеюсь, что скоро смогу использовать вашу v8. - person Jérémie B; 19.02.2021
comment
:) Я получил уведомление об этом вопросе после того, как он был отредактирован. - person Grzegorz Grzybek; 19.02.2021