Jersey a cessé de fonctionner avec InjectionManagerFactory introuvable

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:

Statut HTTP 500 – Servlet.init () pour le servlet Jersey REST Service a généré une exception

type Rapport d’exception

message Servlet.init () pour le servlet Jersey Le service REST a généré 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.init () pour le service REST du servlet Jersey a publié 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.service (CoyoteAdapter.java:349) org.apache.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.apache.tomcat.util.net.SocketProcessorBase.run (SocketProcessorBase.java:49) java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142) java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:617) org.apa che.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.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:474) org.apache.catalina.valves. ErrorReportValve.invoke (ErrorReportValve.java:79) org.apache.catalina.valves.AbstractAccessLogValve.invoke (AbstractAccessLogValve.java:624) org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:349) org.apache. 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.apache .tomcat.util.net.SocketProcessorBase.run (SocketProcessorBase.java:49) java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142) java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:617 ) org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run (TaskThread.java:61) java.lang.Thread.run (Thread.java:745)

L’application est créée avec les dépendances suivantes avec gradle:

dependencies { comstack ( // 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 peut être faux ici? Le script de gradation a fonctionné les derniers mois avec la même version de Tomcat.

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 ça aide

Ajoutez cette dépendance:

  org.glassfish.jersey.inject jersey-hk2  

cf. https://stackoverflow.com/a/44536542/1070215

Jersey 2.26 et versions ultérieures ne sont pas compatibles avec les anciennes versions. La raison derrière cela a été indiqué dans les notes de publication :

Malheureusement, il était nécessaire de procéder à des modifications incompatibles avec 2.26. L’API client réactive, propriétaire d’un maillot concret, a complètement disparu et ne peut plus être prise en charge – elle entre en conflit avec ce qui a été introduit dans JAX-RS 2.1 (le prix pour Jersey étant “le terrain de jeu”).

Un autre changement majeur dans le code de Jersey est la tentative de rendre le cœur de Jersey indépendant de tout cadre d’injection spécifique. Comme vous pouvez le faire maintenant, Jersey 2.x est (était!) Très étroitement dépendant de HK2, ce qui provoque parfois des problèmes (notamment lorsqu’il est utilisé sur d’autres conteneurs d’injection. Jersey définit désormais sa propre façade d’injection , qui injection interne de Jersey.


Pour le moment, il faut utiliser les dépendances suivantes:

Maven

 org.glassfish.jersey.core jersey-common 2.26 org.glassfish.jersey.inject jersey-hk2 2.26 

Gradle

 comstack 'org.glassfish.jersey.core:jersey-common:2.26' comstack 'org.glassfish.jersey.inject:jersey-hk2:2.26' 

Choisissez quelle DI injecter des trucs dans Jersey:

Printemps 4:

  org.glassfish.jersey.ext jersey-spring4  

Printemps 3:

  org.glassfish.jersey.ext jersey-spring3  

HK2:

  org.glassfish.jersey.inject jersey-hk2  

Voici la raison. À partir de Jersey 2.26, Jersey a retiré HK2 comme une dépendance difficile . Il a créé un SPI en tant qu’abstraction pour le fournisseur d’dependency injection, sous la forme d’ InjectionManager et d’ InjectionManagerFactory . Pour que Jersey fonctionne, nous devons avoir une implémentation de InjectionManagerFactory . Il y a deux implémentations de ceci, qui sont pour HK2 et CDI . La dépendance HK2 est le jersey-hk2 autres parlent.

  org.glassfish.jersey.inject jersey-hk2 2.26  

La dépendance CDI est

  org.glassfish.jersey.inject jersey-cdi2-se 2.26  

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 aux autres de fournir leur propre cadre d’dependency injection. Ils n’ont aucun plan pour implémenter d’autres InjectionManager , bien que d’autres aient tenté de l’implémenter pour Guice .

La seule façon dont je pouvais le résoudre était via:

org.glassfish.jersey.core jersey-server $ {jersey-2-version}

  org.glassfish.jersey.containers jersey-container-servlet ${jersey-2-version}   org.glassfish.jersey.inject jersey-hk2 ${jersey-2-version}    org.glassfish.jersey.core jersey-common ${jersey-2-version}   org.glassfish.jersey.containers jersey-container-servlet-core ${jersey-2-version}  

Donc, seulement si j’ai ajouté jersey-container-servlet et que jersey-hk2 fonctionnerait sans erreurs

Pour autant que je puisse voir, les dépendances ont changé entre 2.26-b03 et 2.26-b04 (HK2 a été déplacé de comstack vers testComstack) … un bug).

Cependant, la solution la plus simple consiste à s’en tenir à une version antérieure 🙂

Voici la nouvelle dépendance (août 2017)

    org.glassfish.jersey.core jersey-common 2.0-m03