2014-12-16 8 views
5

Ich versuche, @ Guice Service in einen @ServerEndpoint zu injizieren. Ich verwende Tomcat 8.0.15 als JSR-356-Implementierung. Die Abhängigkeitsinjektion funktioniert jedoch nicht. Gibt es eine zusätzliche Konfiguration, die durchgeführt werden muss, um die Guice-Injektion zu ermöglichen? Beachten Sie, dass ich nur alle Standardjavax-Annotationen verwende.Tomcat8 WebSockets (JSR-356) mit Guice 3.0

+0

"die Abhängigkeitsinjektion funktioniert nicht" ... können Sie das genauer beschreiben? –

+0

Ich erhalte eine Instanziierungsausnahme, wenn ich versuche, eine Konstruktorinjektion mit @Inject innerhalb des SeverEndpoint durchzuführen. – Aritra

Antwort

6

Ich habe das herausgefunden. Der Websocket-Endpunkt muss über einen benutzerdefinierten Konfigurator verfügen, der Instanzen mithilfe der Guice-Injektorinstanz erstellt und zurückgibt.

Beispiel:

Benutzerdefinierte Guice Servletkontext Zuhörer:

public class CustomServletContextListener extends GuiceServletContextListener { 
    public static Injector injector; 

    @Override 
    protected Injector getInjector() { 
     injector = Guice.createInjector(...); 
     return injector; 
    } 
} 

Websockets individuelle Konfigurator:

public class CustomConfigurator extends Configurator { 
    @Override 
    public <T> T getEndpointInstance(Class<T> clazz) 
     throws InstantiationException { 
    return CustomServletContextListener.injector.getInstance(clazz); 
    } 
} 

Und dann im Websocket Endpunkt:

@ServerEndpoint(value = "/ws/sample_endpoint", configurator = CustomConfigurator.class) 
public class SampleEndpoint { 
    private final SomeService service; 

    @Inject 
    public SampleEndpoint(SomeService service) { 
    this.service = service; 
    } 
    ... 
} 
3

Gebäude auf Arrias eigene Antwort:

Um ehrlich zu sein, ich weiß nicht sicher, ob dies mit Guice 3.0 funktioniert, aber es funktioniert für 4.0, das ist die aktuelle stabile Version.

Ich denke, ein wenig sauberer Ansatz ist Ihren CustomConfigurator in etwa wie folgt zu ändern:

public class CustomConfigurator extends Configurator { 
    @Inject 
    private static Injector injector; 

    public <T> T getEndpointInstance(Class<T> endpointClass) { 
     return injector.getInstance(endpointClass); 
    } 
} 

Und dann von Ihrer erweiterten ServletModule Klasse configureServlets Methode, ruft requestStaticInjection(CustomConfigurator.class)

Auf diese Weise werden Sie nicht Setzen Sie den Injektor allen offen. Ich weiß nicht, wie es dir geht, aber es gibt mir ein schönes und verschwommenes Gefühl, dass niemand mit meinem Injektor in Kontakt kommen kann :-).