Ich erhalte die folgende Fehlermeldung beim Ausführen meiner Jersey-API in Tomcat 8.5.11, wodurch meine API beendet wird:
HTTP-Status 500 - Servlet.init () für Servlet Jersey REST Service hat eine Ausnahme ausgelöst
typ Ausnahmebericht
message Servlet.init () für Servlet Jersey REST Service hat eine Ausnahme ausgelöst
beschreibung Auf dem Server ist ein interner Fehler aufgetreten, 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 ausgelöst. ErrorReportValve.invoke (ErrorReportValve.Java:79) org.Apache.catalina.valves.AbstractAccessLogValve.invoke (AbstractAccessLogValve.Java:624) org.Apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter. coyote.http11.Http11Processor.service (Http11Processor.Java:783) org.Apache.coyote.AbstractProcessorLight.process (AbstractProcessorLight.Java:66) org.Apache.coyote.AbstractProtocol $ ConnectionHandler.process (AbstractProtocol $ ConnectionHandler.pr Apache.Tomcat.util.net.NioEndpoint $ SocketProcessor.doRun (NioEndpoint.Java:1434) org.Apache.Tomcat.util.net.SocketProcessorBase.run (SocketProcessorBase.Java:49) Java.util.concurrent.ThreadPoolExecutor.r 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)
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.Avalache.Apache. ErrorReportValve.invoke (ErrorReportValve.Java:79) org.Apache.catalina.valves.AbstractAccessLogValve.invoke (AbstractAccessLogValve.Java:624) org.Apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter. 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 ) org.Apache.Tomcat.util.threads.TaskThread $ WrappingRunnable.run (TaskThread.Java:61) Java.lang.Thread.run (Thread.Java:745)
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.+"
) }
Dies lädt jersey-common-2.26-b04.jar
herunter, das die fehlende Klasse unter /org/glassfish/jersey/internal/inject/InjectionManagerFactory
enthält. Die JAR-Datei wird im Tomcat-Ordner unter WEB-INF/lib
bereitgestellt.
Was kann hier falsch sein? Das Gradle-Skript hat in den letzten Monaten mit derselben Tomcat-Version funktioniert.
Diese Abhängigkeit hinzufügen:
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>2.28</version>
</dependency>
Jersey 2.26 und neuer sind mit älteren Versionen nicht abwärtskompatibel. Der Grund dafür wurde in den Release Notes angegeben :
Leider mussten in 2.26 inkompatible Änderungen vorgenommen werden. Konkret ist die von Jersey geschützte reaktive Client-API komplett weg und kann nicht mehr unterstützt werden - sie steht im Widerspruch zu dem, was in JAX-RS 2.1 eingeführt wurde (das ist der Preis für Jersey als "spezieller Spielplatz").
Eine weitere größere Änderung im Jersey-Code ist der Versuch, den Jersey-Kern von einem bestimmten Einspritz-Framework unabhängig zu machen. Wie Sie vielleicht jetzt wissen, ist Jersey 2.x (war!) Ziemlich stark von HK2 abhängig, was manchmal zu Problemen führt (insbesondere beim Betrieb mit anderen Injektionsbehältern). Jersey definiert jetzt seine eigene Injektionsfassade , das bei ordnungsgemäßer Implementierung die gesamte interne Jersey-Einspritzung ersetzt.
Derzeit sollte man folgende Abhängigkeiten verwenden:
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'
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 der InjectionManager
und InjectionManagerFactory
erstellt. Damit Jersey ausgeführt werden kann, ist eine Implementierung von InjectionManagerFactory
erforderlich. Es gibt zwei Implementierungen davon, die für HK2 und CDI sind. Die HK2-Abhängigkeit ist der jersey-hk2
, von dem andere sprechen.
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>2.26</version>
</dependency>
Die CDI-Abhängigkeit ist
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-cdi2-se</artifactId>
<version>2.26</version>
</dependency>
Diese (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 Framework für die Abhängigkeitsinjektion bereitstellen können. Sie haben keine Pläne, andere InjectionManager
s zu implementieren, obwohl andere Versuche unternommen haben, eine für Guice zu implementieren .
Ich habe das gleiche Problem, nach dem Downgrade auf die im März bereitgestellte Version (2.26-b03) ist alles wieder normal, ich hoffe, es hilft
Wähle den DI, der in Jersey injiziert werden soll:
Frühling 4:
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-spring4</artifactId>
</dependency>
Frühling 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>
Der einzige Weg, wie ich es lösen konnte, war über:
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>
Also, nur wenn ich jersey-container-servlet
und jersey-hk2
hinzufüge, würde es fehlerfrei laufen
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 wurden einige Änderungen an den Trikotabhängigkeiten vorgenommen, die noch nicht abgeschlossen wurden (oder zu denen führten) ein Käfer).
Im Moment ist die einfache Lösung, sich an eine ältere Version zu halten :-)