从Sling / CQ中的捆绑包获取OSGi服务

时间:2011-12-21 19:32:50

标签: servlets osgi connection-pooling sling cq5

我正在使用Day CQ。我想使用Felix控制台中提供的连接池将一些数据存储在SQL Server数据库中。我可以通过使用在defineObjects标记中定义的SlingScriptHelper类型的“sling”对象从JSP中执行此操作

sling.getService(DataSourcePool.class).

但是,我想使用在OSGi包中创建的servlet来处理来自客户端的请求。 servlet没有defineObjects标记,因此未定义“sling”对象。我没有看到在servlet中创建有效的SlingScriptHelper对象的方法,但似乎必须有可能。

有办法吗?

3 个答案:

答案 0 :(得分:17)

要从java OSGi组件获取服务,您不需要SlingScriptHelper,您可以使用BundleContext.getService(...)方法,也可以使用SCR注释让SCR在组件中注入服务。 / p>

作为示例,您可以查看Sling的Slingbucks sample中的某些组件如何使用SCR注释,例如ConfirmedOrdersObserver class以这种方式获取SlingRepository:

   @Reference
   private SlingRepository repository;

有关处理这些注释的Maven插件,请参阅http://felix.apache.org/site/apache-felix-maven-scr-plugin.html

答案 1 :(得分:8)

您可以使用#getServiceReference和#getService方法使用BundleContext访问服务。例如,如果您对ResourceResolverFactory感兴趣,可以这样:

BundleContext bundleContext = FrameworkUtil.getBundle(MyClass.class).getBundleContext();
ServiceReference factoryRef =
     bundleContext.getServiceReference(ResourceResolverFactory.class.getName());
ResourceResolverFactory resolverFactory = 
    (ResourceResolverFactory) bundleContext.getService(factoryRef);

答案 2 :(得分:1)

YourClass obj = this.getSlingScriptHelper().getService(yourclass.class);
obj.whatever();