jsr*_*___ 8 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);
Run Code Online (Sandbox Code Playgroud)
剩下的问题是如何获取对Jersey ServiceLocator的引用,以便我可以调用createAndInitialize()来获取注入了依赖项的对象.我在以前的Jersey版本中看到有一些构造函数变体需要ApplicationHandler,它当然提供对服务定位器的访问(我如何初始化这是另一回事).您还可以看到我已尝试传入父ServiceLocator,但当然解决方案是从子 - >父定位器发生而不是在另一个方向,所以要求父对象失败因为Jersey @Contract和@Service类型不是这里可见.
我是否需要使用GrizzlyHttpServerFactory以外的其他东西?我是否放弃并手动连接我的单身依赖项?
Tra*_*eel 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;
}
}
Run Code Online (Sandbox Code Playgroud)
其他地方:
MyService service
= myResourceConfig.getServiceLocator().createAndInitialize(MyService.class);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7014 次 |
| 最近记录: |