【问题标题】:Jersey Endpoint+OSGi Dependency, Keeping TrackJersey Endpoint+OSGi 依赖,跟踪
【发布时间】: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


    【解决方案1】:

    您可以使用声明式服务获取对 OSGi 服务的引用,而无需访问 BundleContext。 A tutorial can be found here.

    【讨论】:

      【解决方案2】:

      您可以将端点设为singleton resource。这样,您可以让依赖管理器创建单个实例并注入服务,然后将该实例添加到 Jersey 应用程序。

      有一些限制,例如 Jersey 的字段或构造函数注入不起作用。在使用资源的字段时,您还必须注意并发性。

      【讨论】:

        猜你喜欢
        • 2013-01-09
        • 1970-01-01
        • 2012-04-07
        • 1970-01-01
        • 1970-01-01
        • 2010-09-22
        • 1970-01-01
        • 2015-10-03
        • 2017-06-28
        相关资源
        最近更新 更多