2014-12-16 2 views
5

Я пытаюсь @ Включить службу Guice в @ServerEndpoint. Я использую Tomcat 8.0.15 в качестве реализации JSR-356. Однако инъекция зависимостей не работает. Есть ли какая-либо дополнительная конфигурация, которая должна быть выполнена для того, чтобы включить инъекцию Guice? Обратите внимание, что я использую только стандартные аннотации javax.Tomcat8 WebSockets (JSR-356) с Guice 3.0

+0

«инъекция зависимости не работает» ... можете ли вы описать это более подробно? –

+0

Я получаю исключение создания экземпляра, когда я пытаюсь выполнить инъекцию конструктора, используя @Inject внутри SeverEndpoint. – Aritra

ответ

6

Я понял это. Конечная точка Websocket должна иметь настраиваемый конфигуратор, который создает и возвращает экземпляры с использованием экземпляра инжектора Guice.

Пример:

Пользовательского Guice контекст сервлета слушатель:

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

Строительство по собственному ответу Аритры:

Если честно, я не знаю точно, работает ли это с 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)

Таким образом, вы не будете выдать инжектор всем. Я не знаю о вас, но это дает мне приятное и нечеткое чувство внутри, чтобы знать, что никто не сможет возиться со своим инжектором :-).

Смежные вопросы