11
votes

Obtenir des services OSGI d'un paquet à Sling / CQ

J'utilise la journée CQ. Je souhaite stocker certaines données dans une DB SQL Server, à l'aide du pool de connexion disponible dans la console Felix. Je peux le faire à partir d'un JSP, en utilisant l'objet "ELING" de type SLINGSCRIPTHEPTHEPTHEPTHEPTHEPT défini dans la balise de définition xxx

Cependant, je souhaite utiliser un servlet créé dans un ensemble OSGI pour gérer les demandes. du client. Le servlet n'a pas d'étiquette de définementObjects, de sorte que l'objet "Sling" n'est pas défini. Je ne vois pas un moyen de créer un objet SlingCriPthelper valide dans mon servlet, mais il semble que cela soit possible.

Y a-t-il un moyen?


0 commentaires

3 Réponses :


17
votes

Pour obtenir un service à partir d'un composant Java OSGI, vous n'avez pas besoin du SlingCriPtthelper, vous pouvez utiliser la méthode Bundlecontext.GetService (...) ou utiliser des annotations SCR pour permettre à SCR injecter le service dans votre composant. < p> Par exemple, vous pouvez examiner la manière dont certains composants de l'ELING Slingbucks échantillon Utilisez des annotations SCR, le Classe ConfiredordersObServer par exemple obtient le slingRepository de cette manière: xxx

voir http://felix.apache.org/site/apache-felix-maven-scr-plugin. HTML pour le plug-in Maven qui gère ces annotations.


4 commentaires

J'ai pu utiliser l'approche d'annotation SCR. Comment puis-je obtenir une instance du Bundlecontext, cependant? C'était quelque chose que je n'ai pas pu comprendre.


Je n'ai pas testé cela, mais je pense que cela pourrait être fait en utilisant les méthodes activées () ou peut-être liées ().


Dans l'activation (..) et désactiver (..) Prenez un objet OSGI ComponentContext. De cet obj, vous pouvez dériver le Bundlecontext. Vous ne devriez pas avoir besoin de l'objet contextuel du paquet comme Bertrand indiqué; Il vous suffit d'utiliser DCS instancez vos objets dans votre servlet (qui est le service de l'élingue).


Empire29 est correct, si vous utilisez SCR, vous pouvez obtenir le Bundlecontext à partir des paramètres de la méthode Activate / Désactiver. Vous n'avez généralement pas besoin de Bundlecontext.GetService (...) lorsque vous utilisez SCR, @Reference suffira dans la plupart des cas.



9
votes

Vous pouvez utiliser le Bundlecontext pour accéder au service, en utilisant les méthodes #GetServiceReference et #GetService. Par exemple, si vous étiez intéressé par ResourceSolverFactory, vous pouvez l'obtenir comme suit:

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


2 commentaires

J'ai essayé d'utiliser des annotations @reference pour ajouter des services à ma composante de paquet. Pour une raison quelconque, les références étaient nuls. Utilisation de ce code ci-dessus dans le constructeur de mon ensemble, pour obtenir explicitement les services, a fait le tour. Merci :)


Merci! @Reference m'a jeté une "ressource non modifiable". Cela a fonctionné!



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

0 commentaires