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.jar
qui 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.
la source
Réponses:
Ajoutez cette dépendance:
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.
la source
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 :
Pour l'instant, il faut utiliser les dépendances suivantes:
Maven
Gradle
la source
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
InjectionManager
etInjectionManagerFactory
. Donc, pour que Jersey fonctionne, nous devons avoir une implémentation duInjectionManagerFactory
. Il existe deux implémentations de ceci, qui sont pour HK2 et CDI . La dépendance HK2 est celle dontjersey-hk2
parlent les autres.La dépendance CDI est
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
InjectionManager
s, bien que d'autres aient tenté d'en implémenter un pour Guice .la source
Choisissez la DI pour injecter des éléments dans Jersey:
Printemps 4:
Printemps 3:
HK2:
la source
jersey-spring
intégration utilise toujours un pont HK2 sous le capot pour le faire fonctionner.La seule façon de résoudre ce problème était de:
org.glassfish.jersey.core jersey-server $ {jersey-2-version}
Donc, seulement si j'ai ajouté
jersey-container-servlet
etjersey-hk2
que cela fonctionnerait sans erreursla source
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 :-)
la source
Voici la nouvelle dépendance (août 2017)
la source