【发布时间】:2015-06-07 22:31:57
【问题描述】:
我有一个 Jersey 端点,它使用自定义 OSGi 服务 ExceptionManager 服务。
@Path("service")
public class ServiceFacade {
private volatile ExceptionManager exceptionManager;
public ServiceFacade() {
BundleContext bC = FrameworkUtil.getBundle(ServiceFacade.class).getBundleContext();
ServiceReference<ExceptionManager> sR = bC.getServiceReference(ExceptionManager.class);
if (sR != null)
this.exceptionManager = bC.getService(sR);
}
@GET
@Consumes({MediaType.APPLICATION_JSON})
@Produces(MediaType.APPLICATION_JSON)
public Response sayHello() {
try {
if (exceptionManager == null)
return Response.status(Status.SERVICE_UNAVAILABLE).build();
// Do some work...
} catch (Exception e) {
exceptionManager.handle(e);
}
}
}
这个 Jersey 类作为一个简单的类添加到 Jersey 应用程序中,这意味着每次用户点击这个端点时,都会创建这个类的一个新实例来处理请求。如您所见,该类包含一个初始化ExceptionManager 服务的构造函数。我的问题是,有没有一种简化的方法可以在不去BundleContext 的情况下检索服务?
我见过DependencyManager,但是这个包似乎只在激活过程中将依赖项添加到类(在这种情况下为ServiceFacade),但是依赖项解析为时过早,这必须在运行期间完成-时间,每次创建实例时。 Bellow 是 DependencyManager 的近似值,但不是解决方案:
public class Activator extends DependencyActivatorBase {
@Override
public void init(BundleContext bundleContext, DependencyManager dependencyManager) throws Exception {
dependencyManager.add(createComponent()
.setImplementation(ServiceFacade.class)
.add(createServiceDependency()
.setService(ExceptionManager.class)
.setRequired(true));
}
}
谢谢。-
【问题讨论】:
标签: java rest osgi jersey-2.0 apache-felix