2016-08-25 4 views
0

У меня есть проект, основанный на технологии Jersey 2, Guice 3.0. Поскольку каркас Jersey 2 использует HK2, мне пришлось настроить мост HK2-Guice.Как настроить HK2 для использования аннотации Guice @Inject из пакета com.google.inject?

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

JerseyConfiguration:

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 аннотацию. Но когда я использую аннотацию com.google.inject.Inject, мои свойства класса не вводятся. & Я получаю исключение NullPointerException, когда пытаюсь использовать это свойство.

Как я могу использовать аннотацию com.google.inject.Inject?

ответ

0

Вы должны создать свой собственный InjectionResolver для com.google.inject.Inject. Следующий пример создаст тот, который работает точно как javax.inject.Inject. Однако есть, вероятно, тонкие различия между Google Inject и Javax Inject, которые НЕ записаны в нижеприведенной реализации. Если вы полагаетесь на какие-либо из этих различий, возможно, вам понадобится умнее в реализации InjectionResolver. Затем вам также нужно будет зарегистрировать свой 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; 
    } 

} 
+0

Более подробную информацию о InjectionResolvers можно найти здесь: https://hk2.java.net/2.5.0-b08/extensibility.html#Custom_Injection_Resolvers – jwells131313

+0

Но, как я определил мост hk2-guice - я не могу использовать только аннотации Google, как они есть? Без InjectionResolver impl. – Alexiuscrow

+0

Мост позволяет Guice видеть сервисы HK2 и HK2, чтобы увидеть услуги Guice. InjectionResolver позволит вам использовать аннотации Guice в сервисах, созданных HK2 (это должно быть то, что происходит в вашем примере) – jwells131313