Jersey a cessé de fonctionner avec InjectionManagerFactory introuvable

161

Je reçois l'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 levé une exception

type Rapport d'exception

message Servlet.init () pour le servlet Jersey REST Service a jeté 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 servlet Jersey REST Service a lancé une exception org.apache.catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.java:474) org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.invoke (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.Http. 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.aputilcat.tache. 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. ErrorReportValve.invoke (ErrorReportValve.java:79) org.apache.catalina.valves.

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.+"
    ) }

Ce téléchargement jersey-common-2.26-b04.jarqui contient la classe manquante sous/org/glassfish/jersey/internal/inject/InjectionManagerFactory . Le fichier jar est déployé dans le dossier Tomcat sousWEB-INF/lib

Qu'est-ce qui ne va pas ici? Le script gradle a fonctionné ces derniers mois avec la même version de Tomcat.

Gregor
la source
1
je vois qu'il y avait une nouvelle version du maillot le 19/05 - vérifiez si c'est le problème, j'ai le même problème actuellement
Roman Kesler
search.maven.org
Roman Kesler
Ce tutoriel m'a aidé à résoudre ce problème crunchify.com
...

Réponses:

316

Ajoutez cette dépendance:

<dependency>
    <groupId>org.glassfish.jersey.inject</groupId>
    <artifactId>jersey-hk2</artifactId>
    <version>2.28</version>
</dependency>

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

Assurez-vous de ne pas mélanger vos versions de dépendance Jersey. Cette réponse indique la version "2.28", mais utilisez la version de vos autres versions de dépendance Jersey.

cthiebaud
la source
2
A travaillé pour moi avec la version 2.26. Je ne voulais pas utiliser de versions bêta dans le code de production.
saganas
2
Merci, c'est la bonne réponse. Fonctionne avec 2.26
mario
1
Voir aussi pour l'explication.
Paul Samsotha
2
C'était tout pour moi - la version 2.28.
absmiths
Ce qui était époustouflant pour moi, c'est que cela fonctionnait, puis cela a cessé de fonctionner JUSQU'À ce que j'aie fait l'inclusion ci-dessus selon ce post. Quoi qu'il en soit, merci. Ma version principale était 2.30 et ma version inject comme ci-dessus, c'est-à-dire 2.28.
Beezer le
127

Jersey 2.26 et plus récent ne sont pas rétrocompatibles avec les anciennes versions. La raison derrière cela a été indiquée dans les notes de publication :

Malheureusement, il était nécessaire d'apporter des modifications incompatibles vers l'arrière dans la version 2.26. Concrètement, l'API client réactif propriétaire de Jersey a complètement disparu 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 pour Jersey étant le "terrain de jeu des spécifications ...").

Un autre changement plus important dans le code de Jersey est la tentative de rendre le noyau de Jersey indépendant de tout cadre d'injection spécifique. Comme vous pourriez maintenant, Jersey 2.x est (était!) Assez étroitement dépendant de HK2, ce qui pose parfois des problèmes (en particulier lors de l'exécution sur d'autres conteneurs d'injection. Jersey définit maintenant sa propre façade d'injection , qui, lorsqu'elle est mise en œuvre correctement, remplace tout injection interne de Jersey.


Pour l'instant, il faut utiliser les dépendances suivantes:

Maven

<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'
wypieprz
la source
Voir également le problème Impossible de passer de la 2.25.1 à la 2.26
Grigory Kislin
11
Soupir ... pourquoi Jersey ne ferait-il pas passer la version 3.0 à la version 3.0 s'ils apportent un changement de rupture ..
trevorism
1
@trevorism J'ai le sentiment qu'ils veulent garder la version majeure synchronisée avec la version majeure de JAX-RS. C'est la seule chose qui a du sens pour moi.
Paul Samsotha
Jersey-common n'est pas non plus une exigence (à ajouter manuellement ). Cela devrait déjà être récupéré par jersey-server, qui devrait être récupéré par jersey-container-servlet-core ou toute autre dépendance de jersey "principale" que vous utilisez. La seule dépendance requise pour se débarrasser de l'erreur en question est le jersey-hk2 (ou jersey-cdi2-se, comme mentionné ici ).
Paul Samsotha du
@LuisF, ce serait correct s'il n'incluait pas la dépendance inutile jersey-common. C'est déjà une dépendance transitive.
Paul Samsotha
47

Voici la raison. À partir de Jersey 2.26, Jersey a supprimé HK2 en tant que dépendance dure . Il a créé un SPI comme façade pour le fournisseur d'injection de dépendances, sous la forme de InjectionManageret InjectionManagerFactory. Donc, pour que Jersey fonctionne, nous devons avoir une implémentation du InjectionManagerFactory. Il existe deux implémentations de ceci, qui sont pour HK2 et CDI . La dépendance HK2 est celle dont jersey-hk2parlent les autres.

<dependency>
    <groupId>org.glassfish.jersey.inject</groupId>
    <artifactId>jersey-hk2</artifactId>
    <version>2.26</version>
</dependency>

La dépendance CDI est

<dependency>
    <groupId>org.glassfish.jersey.inject</groupId>
    <artifactId>jersey-cdi2-se</artifactId>
    <version>2.26</version>
</dependency>

Ce (jersey-cdi2-se) ne doit être utilisé que pour les environnements SE et non pour les environnements EE.

Jersey a apporté cette modification pour permettre aux autres de fournir leur propre cadre d'injection de dépendances. Ils n'ont pas l'intention d'implémenter d'autres InjectionManagers, bien que d'autres aient tenté d'en implémenter un pour Guice .

Paul Samsotha
la source
1
Notez que l'utilisation de CDI (jersey-cdi2-se) nécessite une configuration bean.xml dans META-INF. Sinon, l'exception suivante sera levée: java.lang.IllegalStateException: WELD-ENV-000016: fichier beans.xml manquant dans META-INF
Marco Montel
Cette réponse m'a aidé avec tant d'incohérences, +1 pour clarifier jersey-cdi2-se ne devrait être utilisé que pour SE
Daniel Arechiga le
11

Choisissez la DI pour injecter des éléments 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>
broc.seib
la source
2
Ce n'est pas si facile. Vous ne pouvez pas simplement remplacer HK2 par Spring. L' jersey-springintégration utilise toujours un pont HK2 sous le capot pour le faire fonctionner.
Paul Samsotha
2

La seule façon de résoudre ce problème était de:

org.glassfish.jersey.core jersey-server $ {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, seulement si j'ai ajouté jersey-container-servletet jersey-hk2que cela fonctionnerait sans erreurs

Johannes Jander
la source
0

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 compile à testCompile) ... il pourrait y avoir des changements dans les dépendances de jersey qui n'ont pas encore été terminés (ou qui conduisent à un bug).

Cependant, pour le moment, la solution simple est de s'en tenir à une version plus ancienne :-)

Nikolaus Krismer
la source
-2

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

    <!-- https://mvnrepository.com/artifact/org.glassfish.jersey.core/jersey-common -->
<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-common</artifactId>
    <version>2.0-m03</version>
</dependency>
Ricardo Rossini
la source