Beim Ausführen meiner Jersey-API in Tomcat 8.5.11 wird die folgende Fehlermeldung angezeigt, die dazu führt, dass meine API gestoppt wird:
HTTP-Status 500 - Servlet.init () für Servlet Jersey REST Service hat eine Ausnahme ausgelöst
Geben Sie Ausnahmebericht ein
Nachricht Servlet.init () für Servlet Jersey REST Service hat eine Ausnahme ausgelöst
Beschreibung Der Server hat einen internen Fehler festgestellt, der die Erfüllung dieser Anforderung verhindert hat.
Ausnahme
javax.servlet.ServletException: Servlet.init () für Servlet Jersey REST Service hat die Ausnahme org.apache.catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.java:474) org.apache.catalina.valves.ErrorReportValve.invoke (Error. java: 79) org.apache.catalina.valves.AbstractAccessLogValve.invoke (AbstractAccessLogValve.java:624) org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:349) org.apache.coyote.http11.Htt. service (Http11Processor.java:783) org.apache.coyote.AbstractProcessorLight.process (AbstractProcessorLight.java:66) org.apache.coyote.AbstractProtocol $ ConnectionHandler.process (AbstractProtocol.java:798) org.apache.tomcat. net.NioEndpoint $ SocketProcessor.doRun (NioEndpoint.java:1434) org.apache.tomcat.util.net.SocketProcessorBase.Führen Sie (SocketProcessorBase.java:49) aus. java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142) java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:6t) org.ut. threads.TaskThread $ WrappingRunnable.run (TaskThread.java:61) java.lang.Thread.run (Thread.java:745)
Ursache
java.lang.IllegalStateException: InjectionManagerFactory nicht gefunden. 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.
Die Anwendung wird mit den folgenden Abhängigkeiten mit gradle erstellt:
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.+"
) }
Dieser Download jersey-common-2.26-b04.jar
enthält die fehlende Klasse unter /org/glassfish/jersey/internal/inject/InjectionManagerFactory
. Die JAR-Datei wird im Tomcat-Ordner unter bereitgestelltWEB-INF/lib
Was kann hier falsch sein? Das Gradle-Skript hat in den letzten Monaten mit derselben Tomcat-Version funktioniert.
quelle
Antworten:
Fügen Sie diese Abhängigkeit hinzu:
vgl. https://stackoverflow.com/a/44536542/1070215
Stellen Sie sicher, dass Sie Ihre Jersey-Abhängigkeitsversionen nicht mischen. Diese Antwort lautet Version "2.28", verwenden Sie jedoch die Version Ihrer anderen Jersey-Abhängigkeitsversionen.
quelle
Jersey 2.26 und höher sind nicht abwärtskompatibel mit älteren Versionen. Der Grund dafür wurde in den Versionshinweisen angegeben :
Für den Moment sollte man folgende Abhängigkeiten verwenden:
Maven
Gradle
quelle
Hier ist der Grund. Ab Jersey 2.26 entfernte Jersey HK2 als harte Abhängigkeit. Es wurde ein SPI als Fassade für den Abhängigkeitsinjektionsanbieter in Form des
InjectionManager
und erstelltInjectionManagerFactory
. Damit Jersey laufen kann, müssen wir eine Implementierung des habenInjectionManagerFactory
. Es gibt zwei Implementierungen davon, die für HK2 und CDI sind . Die HK2-Abhängigkeit ist diejersey-hk2
, über die die anderen sprechen.Die CDI-Abhängigkeit ist
Dies (jersey-cdi2-se) sollte nur für SE-Umgebungen und nicht für EE-Umgebungen verwendet werden.
Jersey hat diese Änderung vorgenommen, damit andere ihr eigenes Abhängigkeitsinjektions-Framework bereitstellen können. Sie haben keine Pläne, andere
InjectionManager
s zu implementieren , obwohl andere versucht haben, eines für Guice zu implementieren .quelle
Wählen Sie aus, welcher DI in Jersey injiziert werden soll:
Frühling 4:
Frühling 3:
HK2:
quelle
jersey-spring
Integration wird weiterhin eine HK2-Brücke unter der Haube verwendet, damit sie funktioniert.Ich konnte es nur lösen über:
org.glassfish.jersey.core Trikot-Server $ {Trikot-2-Version}
Also nur, wenn ich hinzugefügt hätte
jersey-container-servlet
undjersey-hk2
es ohne Fehler laufen würdequelle
Soweit ich sehen kann, haben sich die Abhängigkeiten zwischen 2.26-b03 und 2.26-b04 geändert (HK2 wurde von compile nach testCompile verschoben). Möglicherweise haben sich die Trikotabhängigkeiten geändert, die noch nicht abgeschlossen wurden (oder zu führen) ein Käfer).
Im Moment besteht die einfache Lösung jedoch darin, sich an eine ältere Version zu halten :-)
quelle
Hier ist die neue Abhängigkeit (August 2017)
quelle