web-dev-qa-db-fra.com

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:

É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.

126
gregor

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

241
cthiebaud

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'
113
wypieprz

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 InjectionManagers, bien que d’autres aient déjà fait tentatives d’en implémenter pour Guice .

35
Paul Samsotha

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

25
Roman Kesler

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>
10
broc.seib

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

2
Johannes Jander

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 :-)

0
Nikolaus Krismer