我正在使用Day CQ。我想使用Felix控制台中提供的连接池将一些数据存储在SQL Server数据库中。我可以通过使用在defineObjects标记中定义的SlingScriptHelper类型的“sling”对象从JSP中执行此操作
sling.getService(DataSourcePool.class).
但是,我想使用在OSGi包中创建的servlet来处理来自客户端的请求。 servlet没有defineObjects标记,因此未定义“sling”对象。我没有看到在servlet中创建有效的SlingScriptHelper对象的方法,但似乎必须有可能。
有办法吗?
答案 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();