Aktivieren CDI injizieren in web Services (jaxrs/jersey) auf java se ausgeführt grizzly?
Wie kann ich die CDI-Injektion von Ressourcen in restful-web-service-Ressourcen? Läuft bei mir auf standard-java mit weld 2 (cdi), jersey (jaxrs) und grizzly (web-server). Hier ist meine einfache web-Ressource:
import training.student.StudentRepository;
import javax.inject.Inject;
import javax.ws.rs.*;
@Path("student")
public class StudentWebResource {
@Inject
private StudentRepository studentRepository;
@GET
@Path("count")
@Produces(MediaType.TEXT_PLAIN)
public Integer getCount() {
return studentRepository.studentCount();
}
}
Und hier ist, wie ich habe weld starten meiner einfachen web-server:
public class Main {
public static void main(String[] args) throws Exception {
startCdiApplication();
}
public static void startCdiApplication() throws Exception {
Weld weld = new Weld();
try {
WeldContainer container = weld.initialize();
Application application = container.instance().select(WebServer.class).get();
application.run();
}
finally {
weld.shutdown();
}
}
}
Und den code, den ich vermute, wird geändert werden müssen, zu informieren jersey verwenden Schweißnaht für CDI injizieren Auflösung:
...
import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
import org.glassfish.jersey.jackson.JacksonFeature;
import org.glassfish.jersey.server.ResourceConfig;
public class WebServer implements Application {
/*
* startup the grizzly http server to make available the restful web services
*/
private void startWebServer() throws IOException, InterruptedException {
final ResourceConfig resourceConfig = new ResourceConfig().packages("training.webservice").register(new JacksonFeature());
final HttpServer server = GrizzlyHttpServerFactory.createHttpServer(getBaseUri(), resourceConfig);
server.start();
Thread.currentThread().join();
}
...
@Override
public void run() throws IOException, InterruptedException {
startWebServer();
}
}
InformationsquelleAutor Brice Roncace | 2013-06-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nachdem ich in diesem stackoverflow post, implementiert habe ich die folgende Lösung. Nicht sicher, ob es die beste route zu nehmen, aber es funktionierte.
Erstellte ich eine hk2 Binder und registriert Binder:
Dann geändert, die ResourceConfig Instanziierung von oben:
Meinst du anstelle der Initialisierung der CDI über das zu schweißende Objekt, die ich verwenden sollten (im Fall der Schweißnaht) die StartMain.Haupt-statische Methode, und dann haben
public void main(@Observes ContainerInitialized event)
? oder beziehen Sie sich auf die hk2 CDI-Implementierung?Entweder wird man arbeiten. Wenn man in einer OSGI-Umgebung und benötigen die Trennung der hk2 oder Schweißen-osgi-Projekt arbeiten würde.
BTW, einen besseren Weg, um den BeanManager ist CDI.current().getBeanManager().
Warnung. Diese Antwort ist überholt, da Jersey 2.
InformationsquelleAutor Brice Roncace
Die ausgewählte Antwort stammt aus eine Weile zurück. Es ist nicht sinnvoll zu erklären, jede Bindung in eine benutzerdefinierte HK2 binder.
Ich hatte gerade zum hinzufügen einer Abhängigkeit. Obwohl es entworfen wurde, für den Glassfish-es passt perfekt in andere Behälter. Ich verwende Tomcat /Grizzly.
Hier ist ein Beispiel mit JerseyTest (Gleiches Prinzip, wenn man es aus einer main-Methode). Ich hatte gerade zu erklären, die Abhängigkeit von weld-se und erklären einem Weld container vor dem instanziieren meine Ressourcen - wie Sie auch habe - und es funktioniert out of the box.
new Weld()
sollte verwendet werden, um start-Schweißnaht-container, die in einem eigenständigen env, nicht innerhalb der servlet-container. Registrieren Weld-servlet-listener statt.Könnte Sie dann nach, als ein Beispiel der Registrierung eines Weld-servlet-listener auf eine JerseyTest config ?
Versteh mich nicht falsch, dein code-snippet ist vollkommen ok, da es nur eine test-Klasse. Aber der OP fragte nach Aktivierung CDI (Weld) in einen servlet-container.
InformationsquelleAutor otonglet
Seit mindestens Schweißnaht 2.2.0.Final gibt es keine Notwendigkeit, Durcheinander mit HK2 Binder.
Als offizielle Schweißen Dokumentation Staaten müssen Sie nur zu registrieren
org.jboss.weld.environment.servlet.Listener
. Code snipped vom doc:Oben servlet-listener verwaltet das gesamten Lebenszyklus der Schweißnaht-container. So gibt es keine Notwendigkeit zu:
UPDATE
@EdMelo darauf hingewiesen, Grizzly HTTP server ist nicht voll kompatibel zur Servlet-container. Ich wusste das nicht, vielen Dank für diesen Hinweis. Also ich bin mir nicht sicher, ob meine Antwort noch gilt.
InformationsquelleAutor G. Demecki