Comment activer CDI injecter dans le service web (jaxrs / jersey) sur java se running grizzly?
Comment puis-je autoriser CDI injection de ressources dans les services web restful de ressources? Je suis en cours d'exécution sur le standard java à l'aide de soudure 2 (cdi), jersey (jaxrs), et grizzly (serveur web). Voici mon simple ressource web:
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();
}
}
Et voici comment je l'ai souder démarrage de mon serveur web simple:
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();
}
}
}
Et le code que je soupçonne devront être modifiés afin d'informer jersey à utiliser de la soudure pour le CDI injecter résolution:
...
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();
}
}
source d'informationauteur Brice Roncace
Vous devez vous connecter pour publier un commentaire.
Après avoir vu cette stackoverflow postj'ai mis en place la solution suivante. Pas sûr si c'est la meilleure route à prendre, mais cela a fonctionné.
J'ai créé un hk2 Liant et enregistré le Classeur:
Ensuite modifié le ResourceConfig instanciation à partir de ci-dessus:
La réponse sélectionnée dates à partir d'un certain retour. Il n'est pas possible de déclarer tous les contraignant à une coutume HK2 classeur.
J'ai juste eu à ajouter une dépendance. Même si il a été conçu pour Glassfish, il s'intègre parfaitement dans d'autres récipients. J'utilise Tomcat /Grizzly.
Voici un exemple avec JerseyTest (même principe si vous l'exécutez à partir d'une méthode principale). J'ai juste eu à déclarer une dépendance à souder-se et de déclarer une Soudure de récipient avant l'instanciation de mes ressources - comme vous le fait aussi et il fonctionne hors de la boîte.
Depuis au moins Soudure 2.2.0.Final il n'y a pas besoin de gâcher avec HK2 Classeur.
Officiel de Soudure la documentation unis, vous avez juste besoin d'enregistrer
org.jboss.weld.environment.servlet.Listener
. Code ciselée de doc:Au-dessus de servlet auditeur gère le ensemble du cycle de vie de la Soudure de récipient. Donc, il n'est pas nécessaire pour:
Mise à JOUR
@EdMelo souligné, Grizzly serveur HTTP n'est pas entièrement conforme conteneur de Servlet. Je ne savais pas, merci pour cette astuce. Donc, je ne suis pas sûr que ma réponse s'applique encore ici.