Я получаю приведенную ниже ошибку при запуске моего API-интерфейса Jersey в Tomcat 8.5.11, из-за которого мой API останавливается:
HTTP Status 500 - Servlet.init () для сервлета Джерси. Служба REST вызвала исключение.
тип отчета об исключении
сообщение Servlet.init () для сервлета Джерси Служба REST вызвала исключение
description Сервер обнаружил внутреннюю ошибку, которая не позволила ему выполнить этот запрос.
исключение
javax.servlet.ServletException: Servlet.init () для сервлета Джерси Служба REST вызвала исключение org.apache.catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.java:474) org.apache.catalina.valves.ErrorReportValve.ReportValve.inport Java: 79) org.apache.catalina.valves.AbstractAccessLogValve.invoke (AbstractAccessLogValve.java:624) org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:349) org.apache.cocessorHp служба (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.Выполните (SocketProcessorBase.java:49) java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142) java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:6til.catg.org) или threads.TaskThread $ WrappingRunnable.run (TaskThread.java:61) java.lang.Thread.run (Thread.java:745)
основная причина
java.lang.IllegalStateException: InjectionManagerFactory не найден. org.glassfish.jersey.internal.inject.Injection.lookupInjectionManagerFactory (Injection.java:97) org.glassfish.jersey.internal.inject.Injection.createInjectionManager (Injection.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.jalap.cat. Org. ErrorReportValve.invoke (ErrorReportValve.java:79) org.apache.catalina.valves.
Приложение построено со следующими зависимостями с 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.+"
) }
Эта загрузка, jersey-common-2.26-b04.jar
которая содержит отсутствующий класс в /org/glassfish/jersey/internal/inject/InjectionManagerFactory
. Файл JAR развертывается в папке Tomcat вWEB-INF/lib
Что здесь может быть не так? Сценарий gradle работал последние несколько месяцев с той же версией Tomcat.
источник
Ответы:
Добавьте эту зависимость:
ср https://stackoverflow.com/a/44536542/1070215
Удостоверьтесь, что не перепутали свои версии зависимости Джерси. В этом ответе указана версия «2.28», но используйте любую версию, в которой находятся ваши другие версии зависимостей на Джерси.
источник
Джерси 2.26 и новее не имеют обратной совместимости со старыми версиями. Причина этого была указана в примечаниях к выпуску :
На данный момент следует использовать следующие зависимости:
специалист
Gradle
источник
Вот причина. Начиная с Джерси 2.26, Джерси удалил HK2 как жесткую зависимость. Он создал SPI как фасад для поставщика внедрения зависимостей в форме
InjectionManager
иInjectionManagerFactory
. Так что для запуска Джерси нам нужно иметь реализациюInjectionManagerFactory
. Есть две реализации этого, которые для HK2 и CDI . Зависимость HK2 -jersey-hk2
это то, о чем говорят другие.Зависимость CDI
Это (jersey-cdi2-se) следует использовать только для сред SE, а не для сред EE.
Джерси внес это изменение, чтобы позволить другим предоставлять собственную структуру внедрения зависимостей. У них нет никаких планов по реализации каких-либо других
InjectionManager
, хотя другие пытались реализовать один для Guice .источник
Выберите, какой DI вводить вещи в Джерси:
Весна 4:
Весна 3:
HK2:
источник
jersey-spring
Интеграции все еще использует ¯hk2 мост под капотом , чтобы заставить его работать.Единственный способ, которым я мог решить это, был через:
org.glassfish.jersey.core jersey-server $ {jersey-2-version}
Так что, только если я добавлю
jersey-container-servlet
иjersey-hk2
будет работать без ошибокисточник
Насколько я вижу, зависимости изменились между 2.26-b03 и 2.26-b04 (HK2 был перемещен из компиляции в testCompile) ... возможно, есть некоторые изменения в зависимостях джерси, которые еще не были завершены (или которые приводят к Жук).
Однако сейчас простое решение - придерживаться более старой версии :-)
источник
Вот новая зависимость (август 2017)
источник