2017-06-08 1 views
2

J'ai un objet qui est créé au cours d'une requête, et j'aimerais que cet objet appelle un service. Cependant, lorsque le framework appelle les méthodes bind, il se lie à sa propre instance de la classe, pas celle à laquelle je veux me lier.Comment consommer le service OSGI à partir de la classe non-composant

public class A { 
    final X x; 
    final Y y; 

    public A(Z z) { 
     this.x = z.x; 
     this.y = z.y; 
    } 

    public String doStuff() { 
     //do stuff 
     //call a service 
    } 
} 

public class B extends RestAPIServlet { 

    public String method(@SlingRequest SlingHttpServletRequest request, @SlingResponse SlingHttpServletResponse response) { 
     Z z = new ObjectMapper().readValue(request.getReader(), Z.class); 
     return new A(z).doStuff(); 
    } 
} 

public class C extends TagSupport { 

    public int doStartTag() { 
     Z z = getZFromProperties(); 
     String res = new A(z).doStuff(); 
     pageContext.setAttribute("res", res); 
     return super.doStartTag(); 
    } 
} 

Existe-t-il un moyen d'appeler un service directement depuis A? Existe-t-il un modèle préféré pour la réutilisation de code dans la situation où vous avez une balise et une servlet effectuant le même travail?

On m'a demandé de ne pas faire en sorte que la balise/servlet implémente une interface commune pour donner le service A, ni d'utiliser un fournisseur pour lui donner accès au service via la balise/servlet.

Répondre

2

BundleContext peut être récupérée en utilisant la classe d'assistance FrameworkUtil et que, à son tour, peut être utilisé pour accéder au service que vous souhaitez utiliser. Voici un exemple:

BundleContext bundleContext = FrameworkUtil.getBundle(A.class).getBundleContext(); 
ServiceReference serviceRef = bundleContext.getServiceReference(MyService.class.getName()); 
MyService myService = (MyService) bundleContext.getService(serviceRef);