2011-12-21 24 views
9

Estoy usando Day CQ. Quiero almacenar algunos datos en una base de datos de SQL Server, utilizando el grupo de conexiones disponible en la consola de Felix. Puedo hacer esto desde un JSP, utilizando el objeto "cabestrillo" de tipo SlingScriptHelper se define en las defineObjects etiquetarObtener servicios OSGi de un paquete en Sling/CQ

sling.getService(DataSourcePool.class). 

Sin embargo, quiero utilizar un servlet creado en un paquete OSGi para manejar las peticiones del cliente. El servlet no tiene una etiqueta defineObjects, por lo que el objeto "sling" no está definido. No veo una manera de crear un objeto válido SlingScriptHelper en mi servlet, pero parece que debe ser posible.

¿Hay alguna manera?

Respuesta

17

Para obtener un servicio de un componente OSGi de Java, no necesita SlingScriptHelper, puede usar el método BundleContext.getService (...) o usar anotaciones SCR para permitir que SCR inyecte el servicio en su componente.

A modo de ejemplo, se puede ver la forma en que algunos componentes en Slingbucks sample uso anotaciones SCR de Sling, el ConfirmedOrdersObserver class por ejemplo, tiene la SlingRepository de esta manera:

@Reference 
    private SlingRepository repository; 

Ver http://felix.apache.org/site/apache-felix-maven-scr-plugin.html para el plugin de Maven que se encarga de estas anotaciones .

+0

Pude utilizar el enfoque de anotación SCR. Sin embargo, ¿cómo puedo obtener una instancia del BundleContext? Eso fue algo que no pude descifrar. – joelt

+0

No he probado esto, pero creo que se podría hacer utilizando los métodos activate() o quizás bind(). – joelt

+2

En el activar (..) y desactivar (..) tomar un objeto Osgi ComponentContext. Desde este obj puedes derivar el BundleContext. No debería necesitar el objeto de contexto del paquete, tal como lo indicó Bertrand; solo necesita usar DCS crear instancias de sus objetos en su servlet (que es un servicio de cabestrillo). – empire29

7

Puede usar BundleContext para acceder al Servicio, utilizando los métodos #getServiceReference y #getService. Por ejemplo, si estaban interesados ​​en el ResourceResolverFactory, usted podría conseguir que de este modo:

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

Intenté usar las anotaciones @Reference para agregar servicios a mi componente de paquete. Por alguna razón, las referencias eran nulas. Al usar este código arriba en el constructor de mi paquete, para obtener los servicios de manera explícita, hice el truco. Gracias :) –

+0

Gracias! @Reference me lanzó un "error de recursos no modificables". Esto funcionó! – Jakolcz

0

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

obj.whatever();

Cuestiones relacionadas