Получение услуг OSGi из пакета в Sling / CQ - PullRequest
11 голосов
/ 21 декабря 2011

Я использую Day CQ.Я хочу сохранить некоторые данные в БД SQL Server, используя пул соединений, доступный в консоли Felix.Я могу сделать это из JSP, используя объект «sling» типа SlingScriptHelper, определенный в теге defineObjects

sling.getService(DataSourcePool.class).

Однако я хочу использовать сервлет, созданный в пакете OSGi, для обработки запросов отклиент.У сервлета нет тега defineObjects, поэтому объект "sling" не определен.Я не вижу способа создать действительный объект SlingScriptHelper в моем сервлете, но кажется, что это возможно.

Есть ли способ?

Ответы [ 3 ]

17 голосов
/ 22 декабря 2011

Чтобы получить сервис из java OSGi-компонента, вам не нужен SlingScriptHelper, вы можете либо использовать метод BundleContext.getService (...), либо использовать аннотации SCR, чтобы позволить SCR внедрить сервис в ваш компонент.

В качестве примера вы можете посмотреть, как некоторые компоненты в Sling Slingbucks используют аннотации SCR, класс ConfirmedOrdersObserver , например, получает SlingRepository следующим образом:

   @Reference
   private SlingRepository repository;

См. http://felix.apache.org/site/apache-felix-maven-scr-plugin.html для плагина Maven, который обрабатывает эти аннотации.

8 голосов
/ 10 мая 2012

Вы можете использовать BundleContext для доступа к Сервису, используя методы #getServiceReference и #getService.Например, если вы заинтересованы в ResourceResolverFactory, вы можете получить его так:

BundleContext bundleContext = FrameworkUtil.getBundle(MyClass.class).getBundleContext();
ServiceReference factoryRef =
     bundleContext.getServiceReference(ResourceResolverFactory.class.getName());
ResourceResolverFactory resolverFactory = 
    (ResourceResolverFactory) bundleContext.getService(factoryRef);
1 голос
/ 02 августа 2013
YourClass obj = this.getSlingScriptHelper().getService(yourclass.class);
obj.whatever();
...