2011-12-21 10 views
9

Sto utilizzando Day CQ. Voglio memorizzare alcuni dati in un DB di SQL Server, utilizzando il pool di connessioni disponibile nella console Felix. Posso fare questo da un JSP, utilizzando l'oggetto "sling" di tipo SlingScriptHelper definito nelle defineObjects taggareCome ottenere i servizi OSGi da un pacchetto in Sling/CQ

sling.getService(DataSourcePool.class). 

Tuttavia, voglio usare una servlet creata in un pacchetto OSGi per gestire le richieste dal client. Il servlet non ha un tag defineObjects, quindi l'oggetto "sling" non è definito. Non vedo un modo per creare un oggetto SlingScriptHelper valido nel mio servlet, ma sembra che debba essere possibile.

C'è un modo?

risposta

17

Per ottenere un servizio da un componente OSGi java non è necessario SlingScriptHelper, è possibile utilizzare il metodo BundleContext.getService (...) o utilizzare le annotazioni SCR per consentire all'SCR di immettere il servizio nel componente.

A titolo di esempio, si può guardare a come alcuni componenti in Slingbucks sample uso SCR annotazioni di Sling, il ConfirmedOrdersObserver class ad esempio ottiene lo SlingRepository in questo modo:

@Reference 
    private SlingRepository repository; 

Vedere http://felix.apache.org/site/apache-felix-maven-scr-plugin.html per il plugin Maven che gestisce queste annotazioni .

+0

Sono stato in grado di utilizzare l'approccio di annotazione SCR. Come potrei ottenere un'istanza di BundleContext, però? Era qualcosa che non ero in grado di capire. – joelt

+0

Non l'ho provato, ma sto pensando che potrebbe essere fatto usando i metodi activate() o forse bind(). – joelt

+2

Nell'attivare (..) e disattivare (..) prendere un oggetto ComponentContext di osgi. Da questo obj è possibile derivare il BundleContext. Non è necessario l'oggetto contesto bundle come indicato da Bertrand; hai solo bisogno di usare DCS per istanziare i tuoi oggetti nel tuo servlet (che è il servizio di fionda). – empire29

7

È possibile utilizzare BundleContext per accedere al servizio, utilizzando i metodi #getServiceReference e #getService. Per esempio, se tu fossi interessato al ResourceResolverFactory, si potrebbe ottenere in questo modo:

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

Ho provato a utilizzare le annotazioni @Reference per aggiungere servizi al componente del mio pacchetto. Per qualche ragione i riferimenti erano nulli. Utilizzando questo codice sopra nel costruttore del mio pacchetto, per ottenere esplicitamente i servizi, ha fatto il trucco. Grazie :) –

+0

Grazie! @Reference mi ha lanciato un "errore di risorsa non modificabile". Questo ha funzionato! – Jakolcz

0

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

obj.whatever();

Problemi correlati