2011-12-21 29 views
9

Używam Day CQ. Chcę przechowywać niektóre dane w SQL Server DB, przy użyciu puli połączeń dostępnych w konsoli Felix. Mogę to zrobić z JSP, przy użyciu „procy” obiekt typu SlingScriptHelper określonym w defineObjects oznaczyćUzyskiwanie usług OSGi z pakietu w Sling/CQ

sling.getService(DataSourcePool.class). 

Jednak chcę użyć serwletu utworzonego w wiązce OSGi do obsługi żądań od klienta. Serwlet nie ma znacznika defineObjects, więc obiekt "sling" nie jest zdefiniowany. Nie widzę sposobu, aby utworzyć prawidłowy obiekt SlingScriptHelper w moim serwletu, ale wydaje się, że musi to być możliwe.

Czy istnieje sposób?

Odpowiedz

17

Aby uzyskać usługę z komponentu OSGi java, nie potrzebujesz SlingScriptHelper, możesz użyć metody BundleContext.getService (...) lub użyć adnotacji SCR, aby SCR wstrzyknął usługę w Twoim komponencie.

Jako przykład, można przyjrzeć się, jak niektórych składników Slingbucks sample zastosowania SCR adnotacji Sling, tym ConfirmedOrdersObserver class np dostaje SlingRepository w ten sposób:

@Reference 
    private SlingRepository repository; 

Zobacz http://felix.apache.org/site/apache-felix-maven-scr-plugin.html dla wtyczki Maven, który obsługuje te adnotacje .

+0

Udało mi się zastosować metodę adnotacji SCR. Jak jednak uzyskać instancję BundleContext? To było coś, czego nie byłem w stanie wymyślić. – joelt

+0

Nie przetestowałem tego, ale myślę, że można to zrobić za pomocą metod activate() lub beż(). – joelt

+2

W aktywacji (..) i dezaktywacji (..) weź obiekt o nazwie ComponentContext. Z tego obiektu można wyprowadzić BundleContext. Nie powinieneś potrzebować obiektu kontekstu pakietu, jak wskazano w Bertrand; wystarczy użyć DCS, aby utworzyć instancje obiektów w swoim serwletu (który jest usługą slingową). – empire29

7

Można użyć BundleContext, aby uzyskać dostęp do usługi za pomocą metod #getServiceReference i #getService. Na przykład, jeśli jesteś zainteresowany w ResourceResolverFactory, można dostać go tak:

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

Próbowałem użyć adnotacji @Reference, aby dodać usługi do mojego komponentu pakietu. Z jakiegoś powodu referencje były zerowe. Korzystanie z powyższego kodu w konstruktorze mojego pakietu, aby jawnie uzyskać usługi, załatwił sprawę. Dzięki :) –

+0

Dzięki! @Reference rzucił mi błąd "Nie można modyfikować zasobu". To zadziałało! – Jakolcz

0

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

obj.whatever();