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
Antwort
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;
}
...
}
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 :-).
"die Abhängigkeitsinjektion funktioniert nicht" ... können Sie das genauer beschreiben? –
Ich erhalte eine Instanziierungsausnahme, wenn ich versuche, eine Konstruktorinjektion mit @Inject innerhalb des SeverEndpoint durchzuführen. – Aritra