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

Servlets 从Sling/CQ中的捆绑包获取OSGi服务,servlets,osgi,connection-pooling,sling,aem,Servlets,Osgi,Connection Pooling,Sling,Aem,我使用的是Day CQ。我想使用Felix控制台中可用的连接池在SQL Server DB中存储一些数据。我可以在JSP中通过使用defineObjects标记中定义的类型为SlingScriptHelper的“sling”对象来实现这一点 sling.getService(DataSourcePool.class). 但是,我想使用在OSGi捆绑包中创建的servlet来处理来自客户端的请求。servlet没有defineObjects标记,因此没有定义“sling”对象。我看不到在我的se

我使用的是Day CQ。我想使用Felix控制台中可用的连接池在SQL Server DB中存储一些数据。我可以在JSP中通过使用defineObjects标记中定义的类型为SlingScriptHelper的“sling”对象来实现这一点

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


有没有办法?

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

例如,您可以查看Sling中的一些组件如何使用SCR注释,例如,通过以下方式获取SlingRepository:

   @Reference
   private SlingRepository repository;

有关处理这些注释的Maven插件,请参阅。

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

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

我能够使用SCR注释方法。但是,如何获取BundleContext的实例?这是我无法理解的。我还没有测试出来,但我认为可以使用activate()或bind()方法完成。在activate(..)和deactivate(..)中,使用osgi ComponentContext对象。从这个obj,您可以导出BundleContext。正如Bertrand所指出的,您不应该需要bundle上下文对象tho;您只需要使用DCS在servlet(即sling服务)中实例化您的对象。empire29是正确的,如果您使用SCR,您可以从activate/deactivate方法参数中获取BundleContext。您通常不需要BundleContext.getService(…)当您使用SCR时,@Reference在大多数情况下都足够了。我尝试使用@Reference注释将服务添加到我的bundle组件中。由于某种原因,引用为空。在我的包的构造函数中使用上面的代码,显式地获取服务,就达到了目的。谢谢:)谢谢@引用向我抛出了一个“资源不可修改错误”。这成功了!
YourClass obj = this.getSlingScriptHelper().getService(yourclass.class);
obj.whatever();