如何配置 HK2 以使用包 com.google.inject 中的 Guice @Inject 注释?
How to configure HK2 for using Guice @Inject annotation from package com.google.inject?
我有一个基于 Jersey 2、Guice 3.0 技术的项目。
由于 Jersey 2 框架使用 HK2,因此我必须配置 HK2-Guice 桥。
JerseyGuiceServletContextListener:
package com.example.core;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.servlet.GuiceServletContextListener;
import com.google.inject.servlet.ServletModule;
public class JerseyGuiceServletContextListener extends GuiceServletContextListener {
static Injector injector;
@Override
protected Injector getInjector() {
injector = Guice.createInjector(new ServletModule() {
@Override
protected void configureServlets() {
//some code here
}
});
return injector;
}
}
球衣配置:
package com.example.core;
import org.glassfish.hk2.api.ServiceLocator;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.server.ServerProperties;
import org.jvnet.hk2.guice.bridge.api.GuiceBridge;
import org.jvnet.hk2.guice.bridge.api.GuiceIntoHK2Bridge;
import javax.inject.Inject;
//...
class JerseyConfiguration extends ResourceConfig {
@Inject
public JerseyConfiguration(ServiceLocator serviceLocator) {
packages("com.example.ws");
GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator);
GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class);
guiceBridge.bridgeGuiceInjector(JerseyGuiceServletContextListener.injector);
}
}
如果我使用 javax.inject.Inject
注释注入一些 class 属性,一切正常。但是当我使用 com.google.inject.Inject
注释时,我的 class 属性没有被注入并且当我尝试使用这个 属性.
时我得到 NullPointerException
如何使用 com.google.inject.Inject
注释?
您将为 com.google.inject.Inject 创建自己的 InjectionResolver。以下示例将创建一个与 javax.inject.Inject 完全 一样工作的示例。然而,google Inject 和 javax Inject 之间可能存在细微差异,这些差异未在以下实现中捕获。如果您依赖于这些差异中的任何一个,您可能需要在 InjectionResolver 的实现中变得更聪明。然后,您还必须在 Jersey 绑定调用或其他调用中注册您的 InjectionResolver。这是基本实现:
@Singleton
public class GuiceInjectResolver implements InjectionResolver<com.google.inject.Inject> {
@Inject @Named(InjectionResolver.SYSTEM_RESOLVER_NAME)
private InjectionResolver<Inject> systemResolver;
/* (non-Javadoc)
* @see org.glassfish.hk2.api.InjectionResolver#resolve(org.glassfish.hk2.api.Injectee, org.glassfish.hk2.api.ServiceHandle)
*/
@Override
public Object resolve(Injectee injectee, ServiceHandle<?> root) {
return systemResolver.resolve(injectee, root);
}
/* (non-Javadoc)
* @see org.glassfish.hk2.api.InjectionResolver#isConstructorParameterIndicator()
*/
@Override
public boolean isConstructorParameterIndicator() {
return true;
}
/* (non-Javadoc)
* @see org.glassfish.hk2.api.InjectionResolver#isMethodParameterIndicator()
*/
@Override
public boolean isMethodParameterIndicator() {
return true;
}
}
我有一个基于 Jersey 2、Guice 3.0 技术的项目。 由于 Jersey 2 框架使用 HK2,因此我必须配置 HK2-Guice 桥。
JerseyGuiceServletContextListener:
package com.example.core;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.servlet.GuiceServletContextListener;
import com.google.inject.servlet.ServletModule;
public class JerseyGuiceServletContextListener extends GuiceServletContextListener {
static Injector injector;
@Override
protected Injector getInjector() {
injector = Guice.createInjector(new ServletModule() {
@Override
protected void configureServlets() {
//some code here
}
});
return injector;
}
}
球衣配置:
package com.example.core;
import org.glassfish.hk2.api.ServiceLocator;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.server.ServerProperties;
import org.jvnet.hk2.guice.bridge.api.GuiceBridge;
import org.jvnet.hk2.guice.bridge.api.GuiceIntoHK2Bridge;
import javax.inject.Inject;
//...
class JerseyConfiguration extends ResourceConfig {
@Inject
public JerseyConfiguration(ServiceLocator serviceLocator) {
packages("com.example.ws");
GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator);
GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class);
guiceBridge.bridgeGuiceInjector(JerseyGuiceServletContextListener.injector);
}
}
如果我使用 javax.inject.Inject
注释注入一些 class 属性,一切正常。但是当我使用 com.google.inject.Inject
注释时,我的 class 属性没有被注入并且当我尝试使用这个 属性.
如何使用 com.google.inject.Inject
注释?
您将为 com.google.inject.Inject 创建自己的 InjectionResolver。以下示例将创建一个与 javax.inject.Inject 完全 一样工作的示例。然而,google Inject 和 javax Inject 之间可能存在细微差异,这些差异未在以下实现中捕获。如果您依赖于这些差异中的任何一个,您可能需要在 InjectionResolver 的实现中变得更聪明。然后,您还必须在 Jersey 绑定调用或其他调用中注册您的 InjectionResolver。这是基本实现:
@Singleton
public class GuiceInjectResolver implements InjectionResolver<com.google.inject.Inject> {
@Inject @Named(InjectionResolver.SYSTEM_RESOLVER_NAME)
private InjectionResolver<Inject> systemResolver;
/* (non-Javadoc)
* @see org.glassfish.hk2.api.InjectionResolver#resolve(org.glassfish.hk2.api.Injectee, org.glassfish.hk2.api.ServiceHandle)
*/
@Override
public Object resolve(Injectee injectee, ServiceHandle<?> root) {
return systemResolver.resolve(injectee, root);
}
/* (non-Javadoc)
* @see org.glassfish.hk2.api.InjectionResolver#isConstructorParameterIndicator()
*/
@Override
public boolean isConstructorParameterIndicator() {
return true;
}
/* (non-Javadoc)
* @see org.glassfish.hk2.api.InjectionResolver#isMethodParameterIndicator()
*/
@Override
public boolean isMethodParameterIndicator() {
return true;
}
}