如何配置 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;
    }

}