【问题标题】:How to consume OSGI service from non-component class如何使用非组件类的 OSGI 服务
【发布时间】:2017-11-10 20:00:06
【问题描述】:

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

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 让它访问服务。

【问题讨论】:

    标签: java servlets service osgi aem


    【解决方案1】:

    BundleContext 可以使用FrameworkUtil 辅助类检索,然后可以用于访问您想要使用的服务。这是一个例子:

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

    【讨论】:

    • 这里有一点警告:这种方法可能会产生奇怪的连锁反应,导致依赖组件无法正确激活,因为 SCR 没有注释来知道应该以什么顺序激活事物。可能更好传递参考。
    猜你喜欢
    • 2018-09-19
    • 2010-10-02
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 2014-04-23
    • 1970-01-01
    相关资源
    最近更新 更多