Java 如何从非组件类使用OSGI服务
我有一个在请求过程中创建的对象,我希望该对象调用服务。然而,当框架调用bind方法时,它绑定到它自己的类实例,而不是我想要绑定到的实例Java 如何从非组件类使用OSGI服务,java,servlets,service,osgi,aem,Java,Servlets,Service,Osgi,Aem,我有一个在请求过程中创建的对象,我希望该对象调用服务。然而,当框架调用bind方法时,它绑定到它自己的类实例,而不是我想要绑定到的实例 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 se
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();
}
}
有什么方法可以直接从服务器调用服务吗?在标记和servlet执行相同工作的情况下,是否有代码重用的首选模式
我被要求不要让tag/servlet实现一个公共接口来提供服务,也不要使用供应商来提供通过tag/servlet访问服务的权限
BundleContext
可以使用FrameworkUtil
帮助程序类进行检索,而该类又可以用于访问您想要使用的服务。以下是一个例子:
BundleContext bundleContext = FrameworkUtil.getBundle(A.class).getBundleContext();
ServiceReference serviceRef = bundleContext.getServiceReference(MyService.class.getName());
MyService myService = (MyService) bundleContext.getService(serviceRef);
这里有一点警告:这种方法可能会产生奇怪的涟漪效应,导致依赖组件无法正确激活,因为SCR没有注释来知道应该以什么顺序激活。最好是交一份推荐信。