11

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

sling.getService(DataSourcePool.class).

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

有办法吗?

4

3 回答 3

17

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

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

   @Reference
   private SlingRepository repository;

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

于 2011-12-22T13:38:22.560 回答
9

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

BundleContext bundleContext = FrameworkUtil.getBundle(MyClass.class).getBundleContext();
ServiceReference factoryRef =
     bundleContext.getServiceReference(ResourceResolverFactory.class.getName());
ResourceResolverFactory resolverFactory = 
    (ResourceResolverFactory) bundleContext.getService(factoryRef);
于 2012-05-10T02:19:22.473 回答
1
YourClass obj = this.getSlingScriptHelper().getService(yourclass.class);
obj.whatever();
于 2013-08-02T00:23:12.793 回答