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

joe*_*elt 11 osgi servlets connection-pooling sling aem

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

sling.getService(DataSourcePool.class).
Run Code Online (Sandbox Code Playgroud)

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

有办法吗?

Ber*_*taz 17

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

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

   @Reference
   private SlingRepository repository;
Run Code Online (Sandbox Code Playgroud)

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

  • 在activate(..)和deactivate(..)中取一个osgi ComponentContext对象.从这个obj你可以派生出BundleContext.你不应该像Bertrand所说的那样需要束上下文对象; 你只需要使用DCS在你的servlet中实例化你的对象(这是吊索服务). (2认同)

小智 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);
Run Code Online (Sandbox Code Playgroud)