我正在尝试@Inject一个Guice服务到@ServerEndpoint。我使用Tomcat 8.0.15作为JSR-356实现。但是,依赖注入不起作用。是否需要进行任何其他配置才能启用Guice注入?请注意,我只使用所有标准的javax注释。
答案 0 :(得分:8)
我想出来了。 Websocket端点需要有一个自定义配置器,它使用Guice注入器实例创建并返回实例。
示例:
Custom Guice servlet上下文侦听器:
public class CustomServletContextListener extends GuiceServletContextListener {
public static Injector injector;
@Override
protected Injector getInjector() {
injector = Guice.createInjector(...);
return injector;
}
}
Websockets自定义配置器:
public class CustomConfigurator extends Configurator {
@Override
public <T> T getEndpointInstance(Class<T> clazz)
throws InstantiationException {
return CustomServletContextListener.injector.getInstance(clazz);
}
}
然后在Websocket端点:
@ServerEndpoint(value = "/ws/sample_endpoint", configurator = CustomConfigurator.class)
public class SampleEndpoint {
private final SomeService service;
@Inject
public SampleEndpoint(SomeService service) {
this.service = service;
}
...
}
答案 1 :(得分:6)
以Aritra自己的答案为基础:
老实说,我不确定这是否适用于Guice 3.0,但它确实适用于4.0,这是当前的稳定版本。
我认为更简洁的方法是将CustomConfigurator更改为:
public class CustomConfigurator extends Configurator {
@Inject
private static Injector injector;
public <T> T getEndpointInstance(Class<T> endpointClass) {
return injector.getInstance(endpointClass);
}
}
然后从您的扩展ServletModule
班级configureServlets
方法中,拨打requestStaticInjection(CustomConfigurator.class)
这样你就不会将注射器暴露给每个人。我不了解你,但它让我感觉内心很好,模糊,知道没有人能用我的注射器弄乱: - )。