如何在Jersey 2.12获得HK2 ServiceLocator?

时间:2014-09-08 07:56:19

标签: java rest jersey-2.0 hk2

我想创建一个类的单例实例,该类不作为资源或服务参与Jersey,但希望从Jersey ServiceLocator注入其依赖项。

我可以在我的ResourceConfig构造函数中手动注册这个类,然后将ResourceConfig传递给Grizzly工厂方法,如下所示:

ResourceConfig resourceConfig = new DeviceServiceApplication();

LOGGER.info("Starting grizzly2...");
return GrizzlyHttpServerFactory.createHttpServer(BASE_URI,
                                                 resourceConfig, mServiceLocator);

剩下的问题是如何获取对Jersey ServiceLocator的引用,以便我可以调用createAndInitialize()来获取注入了依赖项的对象。我在以前的Jersey版本中看到有一些构造函数变体需要ApplicationHandler,它当然提供对服务定位器的访问(我如何初始化这是另一回事)。你也可以看到我试过传递一个父ServiceLocator但当然解决方案是从child - >父定位器,而不是在另一个方向,所以要求父对象失败,因为泽西@Contract和@Service类型在这里不可见。

我是否需要使用GrizzlyHttpServerFactory以外的其他东西?我是否放弃并手动连接我的单身依赖?

1 个答案:

答案 0 :(得分:14)

我可以通过注册ServiceLocator来获取对ContainerLifecycleListener的引用。

onStartup(Container container)方法中,请致电container.getApplicationHandler().getServiceLocator()

此示例将引用存储为ResourceConfig的成员变量,您可以通过访问者在其他地方使用该变量。

class MyResourceConfig extends ResourceConfig
{
    // won't be initialized until onStartup()
    ServiceLocator serviceLocator;

    public MyResourceConfig()
    {
        register(new ContainerLifecycleListener()
        {
            public void onStartup(Container container)
            {
                // access the ServiceLocator here
                serviceLocator = container.getApplicationHandler().getServiceLocator();

                // ... do what you need with ServiceLocator ...
                MyService service = serviceLocator.createAndInitialize(MyService.class);
            }

            public void onReload(Container container) {/*...*/}
            public void onShutdown(Container container) {/*...*/}
        });
    }

    public ServiceLocator getServiceLocator()
    {
        return serviceLocator;
    }
}

然后在其他地方:

MyService service
    = myResourceConfig.getServiceLocator().createAndInitialize(MyService.class);