9

我想创建一个不作为资源或服务参与 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 但当然解决方案发生在子 -> 父定位器而不是另一个方向,因此向父对象询问我的对象失败,因为 Jersey @Contract 和 @Service 类型不是在这里可见。

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

4

1 回答 1

16

我可以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);
于 2014-10-19T02:07:04.753 回答