Je reçois une erreur ci-dessous lors de l'exécution de mon API Jersey dans Tomcat 8.5.11, ce qui provoque l'arrêt de mon API:
État HTTP 500 - Servlet.init () pour le servlet Jersey REST Le service a déclenché une exception.
type Rapport d'exception
message Servlet.init () pour le servlet Jersey REST Le service a déclenché une exception.
description Le serveur a rencontré une erreur interne qui l'a empêché de répondre à cette demande.
exception
javax.servlet.ServletException: Servlet.in () pour le servlet Jersey REST Le service a levé une exception org.Apache.catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.Java:474) org.Apache.catalina.valves. ErrorReportValve.invoke (ErrorReportValve.Java:79) org.Apache.catalina.valves.AbstractAccessLogValve.invoke (AbstractAccessLogValve.Java:624) org.Apache.catalina.connector.CoyoteAdapter (serviteur). coyote.http11.Http11Processor.service (Http11Processor.Java:783) org.Apache.coyote.AbstractProcessorLight.process (AbstractProcessorLight.Java:66) org.Apache.coyote.AbstractProtorLight.process (AbstractProcessorLight.Java:66) org. Apache.Tomcat.util.net.NioEndpoint $ SocketProcessor.doRun (NioEndpoint.Java:1434) org.Apache.Tomcat.util.net.SocketProcessorBase.run (SocketProcessorBase.Java:49) Java.Concurrent.ThreadPoolExecutor.runWork (SocketProcessorBase.Java:49) ThreadPoolExecutor.Java:1142) Java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.Java:617) o rg.Apache.Tomcat.util.threads.TaskThread $ WrappingRunnable.run (TaskThread.Java:61) Java.lang.Thread.run (Thread.Java:745)
cause première
Java.lang.IllegalStateException: InjectionManagerFactory introuvable. org.glassfish.jersey.internal.inject.Injections.lookupInjectionManagerFactory (Injections.Java:97) org.glassfish.jersey.internal.inject.Injections.createInjectionManager (Injections.Java:89) org.glassfish.jersey.sjoker.server.ApplicationHandler. (ApplicationHandler.Java:282) org.glassfish.jersey.servlet.WebComponent. (WebComponent.Java:335) org.glassfish.jersey.servlet.ServletContainer.init (ServletContainer.Java:178) org.glassfish.jersey.servlet. ServletContainer.init (ServletContainer.Java:370) javax.servlet.GenericServlet.init (GenericServlet.Java:158) org.Apache.catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.Java:47). ErrorReportValve.invoke (ErrorReportValve.Java:79) org.Apache.catalina.valves.AbstractAccessLogValve.invoke (AbstractAccessLogValve.Java:624) org.Apache.catalina.connector.CoyoteAdapter (serviteur). coyote.http11.Http11Processor.service (Http11Processor.Java:783) org.Apache.coyote.AbstractProcessorLight.process (AbstractProcessorLight.Java:66) org.Apache.coyote.AbstractProtocol $ ConnectionHandler.process (AbstractProtocol.Java:798) org.Apache.Tomcat.util.net.NioEndpoint $ SocketProcessor.doRun (NioEndpoint.Java:1434) org. .Tomcat.util.net.SocketProcessorBase.run (SocketProcessorBase.Java:49) Java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.Java:1142) Java.util.concurrent.ThreadPoolExecutor.RunWorker (ThreadPoolExecutor.Java:1142). ) org.Apache.Tomcat.util.threads.TaskThread $ WrappingRunnable.run (TaskThread.Java:61) Java.lang.Thread.run (Thread.Java:745)
L'application est construite avec les dépendances suivantes avec gradle:
dependencies {
compile (
// REST
"org.glassfish.jersey.containers:jersey-container-servlet:2.+",
"javax.servlet:javax.servlet-api:4.+",
// REST Token
"org.bitbucket.b_c:jose4j:0.+",
// MongoDB
"org.hibernate.ogm:hibernate-ogm-bom:5.+",
"org.hibernate.ogm:hibernate-ogm-infinispan:5.+",
"org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.+",
"org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.+",
"org.jboss.narayana.jta:narayana-jta:5.+",
"org.jboss:jboss-transaction-spi:7.+",
"log4j:log4j:1.+",
"org.hibernate.ogm:hibernate-ogm-mongodb:5.+",
"org.bouncycastle:bcprov-jdk15on:1.+"
) }
Ceci télécharge jersey-common-2.26-b04.jar
qui contient la classe manquante sous /org/glassfish/jersey/internal/inject/InjectionManagerFactory
. Le fichier jar est déployé dans le dossier Tomcat sous WEB-INF/lib
Qu'est-ce qui ne va pas ici? Le script Gradle a fonctionné le mois dernier avec la même version de Tomcat.
Ajoutez cette dépendance:
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>2.28</version>
</dependency>
Jersey 2.26 et les versions plus récentes ne sont pas compatibles avec les versions antérieures. La raison derrière cela a été indiquée dans le notes de version :
Malheureusement, il était nécessaire d’apporter des modifications incompatibles à l’envers en 2.26. L’API client réactif concrètement propriétaire de jersey est complètement révolue et ne peut plus être prise en charge. Elle est en conflit avec ce qui a été introduit dans JAX-RS 2.1 (c’est le prix à payer pour que Jersey soit un "terrain de jeu spécifique").
Un autre changement plus important dans le code de Jersey est la tentative de rendre le noyau de Jersey indépendant de toute infrastructure d’injection spécifique. Comme vous le savez peut-être, Jersey 2.x est (était!) Assez étroitement dépendant de HK2, ce qui pose parfois des problèmes (notamment lorsque vous utilisez d'autres récipients d'injection. Jersey définit désormais sa propre façade d'injection. , qui, lorsqu'il est correctement implémenté, remplace toutes les injections internes de Jersey.
Pour l'instant, il convient d'utiliser les dépendances suivantes:
Maven
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-common</artifactId>
<version>2.26</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>2.26</version>
</dependency>
Gradle
compile 'org.glassfish.jersey.core:jersey-common:2.26'
compile 'org.glassfish.jersey.inject:jersey-hk2:2.26'
Voici la raison. À partir de Jersey 2.26, Jersey a supprimé HK2 en tant que dépendance dure. Il a créé un SPI en tant que façade pour le fournisseur d'injection de dépendance, sous la forme de InjectionManager
et InjectionManagerFactory
. Donc, pour que Jersey fonctionne, nous devons avoir une implémentation de la InjectionManagerFactory
. Il y a deux implémentations de cela, qui sont pour HK2 et CDI . La dépendance HK2 est le jersey-hk2
dont parlent les autres.
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>2.26</version>
</dependency>
La dépendance du CDI est
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-cdi2-se</artifactId>
<version>2.26</version>
</dependency>
Ceci (jersey-cdi2-se) ne devrait être utilisé que pour les environnements SE et non les environnements EE.
Jersey a apporté cette modification pour permettre à d’autres de fournir leur propre cadre d’injection de dépendance. Ils ne prévoient pas d’implémenter d’autres InjectionManager
s, bien que d’autres aient déjà fait tentatives d’en implémenter pour Guice .
J'ai le même problème, après avoir rétrogradé la version déployée en mars (2.26-b03), tout est rentré dans l'ordre, j'espère que cela aidera
Choisissez quelle DI injecter dans Jersey:
Printemps 4:
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-spring4</artifactId>
</dependency>
Printemps 3:
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-spring3</artifactId>
</dependency>
HK2:
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
</dependency>
Le seul moyen de le résoudre était via:
org.glassfish.jersey.core serveur-jersey $ {jersey-2-version}
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>${jersey-2-version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>${jersey-2-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.core/jersey-common -->
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-common</artifactId>
<version>${jersey-2-version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<version>${jersey-2-version}</version>
</dependency>
Donc, ce n’est que si j’ajoutais jersey-container-servlet
et jersey-hk2
qu’il fonctionnerait sans erreur
Autant que je sache, les dépendances ont changé entre les versions 2.26-b03 et 2.26-b04 (HK2 a été déplacé de compile à testCompile) ... il se peut que certaines modifications des dépendances du maillot ne soient pas encore terminées (ou conduisent à un bug).
Cependant, pour le moment, la solution la plus simple est de s'en tenir à une ancienne version :-)