如何从非组件类中使用OSGI服务

时间:2017-06-08 23:19:16

标签: java servlets service osgi aem

我有一个在请求过程中创建的对象,我希望该对象可以调用服务。但是,当框架调用绑定方法时,它会绑定到自己的类实例,而不是我想要绑定的实例。

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();
    }
}

有没有办法直接从A呼叫服务?在您有标记和servlet执行相同工作的情况下,是否存在代码重用的首选模式?

我被要求不要使标签/ servlet实现一个公共接口来为A提供服务,也不要让供应商通过标签/ servlet使用它来访问服务。

1 个答案:

答案 0 :(得分:2)

可以使用BundleContext帮助程序类检索

FrameworkUtil,然后可以使用它来访问要使用的服务。这是一个例子:

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