Java 如何在泽西岛2.12获得HK2 ServiceLocator?

Java 如何在泽西岛2.12获得HK2 ServiceLocator?,java,rest,jersey-2.0,hk2,Java,Rest,Jersey 2.0,Hk2,我想创建一个类的单例实例,该类不作为资源或服务参与Jersey,但希望其依赖项从Jersey ServiceLocator注入 我可以在我的ResourceConfig构造函数中手动注册这个类,然后ResourceConfig被传递到Grizzly工厂方法,如下所示: ResourceConfig resourceConfig = new DeviceServiceApplication(); LOGGER.info("Starting grizzly2..."); return Grizzl

我想创建一个类的单例实例,该类不作为资源或服务参与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->parent locator进行的,而不是从另一个方向进行的,因此向父对象请求我的对象失败,因为Jersey@Contract和@Service类型在此处不可见


我需要使用GrizzlyHttpServerFactory以外的其他工具吗?我是否放弃并手动连接我的singleton依赖项?

通过注册
容器LifeCycleListener
,我能够获得对
ServiceLocator
的引用

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);

这是唯一的办法吗?还有别的办法吗?访问容器生命周期似乎有些过分。另一个替代解决方案是:什么是资源配置?除了
myResourceConfig.getServiceLocator()
,什么时候调用这个类?无法从jersey core服务器版本的org.glassfish.jersey.server.spi.Container解析方法“getApplicationHandler()”:2.1成功地将jersey core服务器版本更改为2.10.4版本。