Otrzymuję poniższy błąd podczas uruchamiania interfejsu Jersey API w Tomcat 8.5.11, który powoduje zatrzymanie mojego interfejsu API:
Status HTTP 500 - Servlet.init () dla serwletu Jersey Usługa REST zgłosiła wyjątek
wpisz Raport wyjątków
komunikat Servlet.init () dla serwletu Jersey Usługa REST zgłosił wyjątek
opis Serwer napotkał błąd wewnętrzny, który uniemożliwił mu realizację tego żądania.
wyjątek
javax.servlet.ServletException: Servlet.init () dla serwletu Usługa REST na Jersey zgłosiła wyjątek org.apache.catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.java:474) org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.invoke (ErrorReportValve.invoke. 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.apil.tomcat.ut 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.aputache.tomcat. Threads.TaskThread $ WrappingRunnable.run (TaskThread.java:61) java.lang.Thread.run (Thread.java:745)
pierwotna przyczyna
java.lang.IllegalStateException: nie znaleziono InjectionManagerFactory. 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.apacheves.catalina. ErrorReportValve.invoke (ErrorReportValve.java:79) org.apache.catalina.valves.
Aplikacja jest zbudowana z następującymi zależnościami w 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.+"
) }
Ten plik do pobrania jersey-common-2.26-b04.jar
zawiera brakującą klasę w ramach /org/glassfish/jersey/internal/inject/InjectionManagerFactory
. Plik jar jest wdrażany w folderze Tomcat wWEB-INF/lib
Co tu może być nie tak? Skrypt gradle działał przez ostatnie kilka miesięcy z tą samą wersją Tomcata.
źródło
Odpowiedzi:
Dodaj tę zależność:
por. https://stackoverflow.com/a/44536542/1070215
Upewnij się, że nie mieszasz swoich wersji zależności Jersey. Ta odpowiedź mówi o wersji "2.28", ale użyj dowolnej wersji, którą posiadasz w innych wersjach zależności Jersey.
źródło
Jersey 2.26 i nowsze nie są wstecznie kompatybilne ze starszymi wersjami. Powód tego został podany w informacjach o wydaniu :
Na razie należy użyć następujących zależności:
Maven
Gradle
źródło
Oto powód. Począwszy od Jersey 2.26, Jersey usunął HK2 jako trudną zależność. Stworzył SPI jako fasadę dla dostawcy wstrzykiwania zależności, w postaci
InjectionManager
iInjectionManagerFactory
. Aby Jersey działał, musimy mieć implementacjęInjectionManagerFactory
. Istnieją dwie implementacje tego, które są dla HK2 i CDI .jersey-hk2
Inni mówią o zależności od HK2 .Zależność CDI to
To (jersey-cdi2-se) powinno być używane tylko w środowiskach SE, a nie w środowiskach EE.
Jersey wprowadził tę zmianę, aby umożliwić innym udostępnianie własnej struktury wstrzykiwania zależności. Nie mają żadnych planów wdrożenia innych
InjectionManager
, chociaż inni próbowali zaimplementować taki dla Guice .źródło
Wybierz DI, aby wstrzyknąć rzeczy do Jersey:
Wiosna 4:
Wiosna 3:
HK2:
źródło
jersey-spring
Integracja nadal używa most HK2 pod maską, aby to działało.Jedyny sposób, w jaki mogłem go rozwiązać, to:
org.glassfish.jersey.core jersey-server $ {jersey-2-version}
Czyli tylko gdybym dodał
jersey-container-servlet
ijersey-hk2
czy działałby bez błędówźródło
O ile widzę, zależności zmieniły się między 2.26-b03 a 2.26-b04 (HK2 został przeniesiony z kompilacji do testCompile) ... może nastąpić pewna zmiana w zależnościach koszulki, która nie została jeszcze ukończona (lub która prowadzi do błąd).
Jednak w tej chwili prostym rozwiązaniem jest trzymanie się starszej wersji :-)
źródło
Oto nowa zależność (sierpień 2017)
źródło