2017-06-08 7 views
2

リクエストの過程で作成されたオブジェクトがあり、そのオブジェクトにサービスを呼びたいと思います。しかし、フレームワークがバインドメソッドを呼び出すとき、バインドするメソッドではなく、クラスの独自のインスタンスにバインドします。非コンポーネントクラスからOSGIサービスを使用する方法

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から直接サービスを呼び出す方法はありますか?タグとサーブレットが同じ作業を実行している状況で、コードの再利用に適したパターンがありますか?

私はタグ/サーブレットがサービスにAを与える共通のインタフェースを実装しないように頼まれました。また、サプライヤを使ってタグ/サーブレットを通してサービスにアクセスすることもできませんでした。

答えて

2

BundleContextは、FrameworkUtilヘルパークラスを使用して取得でき、これを使用して使用するサービスにアクセスすることができます。ここに例があります:

BundleContext bundleContext = FrameworkUtil.getBundle(A.class).getBundleContext(); 
ServiceReference serviceRef = bundleContext.getServiceReference(MyService.class.getName()); 
MyService myService = (MyService) bundleContext.getService(serviceRef); 
関連する問題