Ответ 1
У меня такая же проблема, после перехода на версию, развернутую в марте (2.26-b03), все возвращается в норму, надеюсь, что это поможет
Я получаю ниже ошибки при запуске моего API-интерфейса Jersey в Tomcat 8.5.11, из-за чего мой API останавливается:
HTTP Status 500 - Servlet.init() для сервлета Служба REST Джерси исключила исключение
отчет об исключении типа
сообщение Servlet.init() для сервлета Джерси Служба REST исключила
описание Сервер обнаружил внутреннюю ошибку, которая помешала ему выполнить этот запрос.
исключение
javax.servlet.ServletException: Servlet.init() для сервлета. Служба REST Джерси выбрала исключение org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:474) org.apache.catalina.valves.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.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(ThreadPoolExecutor.java:617) org.apa che.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61) java.lang.Thread.run(Thread.java:745)
первопричина
java.lang.IllegalStateException: 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.apache.catalina.valves. 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.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(ThreadPoolExecutor.java:617 ) org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61) java.lang.Thread.run(Thread.java:745)
Приложение построено со следующими зависимостями с помощью 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.
У меня такая же проблема, после перехода на версию, развернутую в марте (2.26-b03), все возвращается в норму, надеюсь, что это поможет
Добавьте эту зависимость:
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>2.28</version>
</dependency>
Джерси 2.26 и новее не имеют обратной совместимости со старыми версиями. Причина этого была указана в примечаниях к выпуску:
К сожалению, в 2.26 возникла необходимость внести обратно несовместимые изменения. Конкретно принадлежащий jersey API-интерфейс реактивного клиента полностью исчез и больше не может поддерживаться - он противоречит тому, что было представлено в JAX-RS 2.1 (что цена на Джерси - "игровая площадка спекуляции").
Еще одно крупное изменение в коде Джерси - попытка сделать ядро Джерси независимым от какой-либо конкретной инфраструктуры инъекций. Как вы могли бы сейчас заметить, Jersey 2.x (был!) Довольно сильно зависит от HK2, что иногда вызывает проблемы (особенно при работе с другими контейнерами для инъекций. Джерси теперь определяет свой собственный фасад для инъекций, который при правильной реализации заменяет все внутренняя инъекция Джерси.
На данный момент следует использовать следующие зависимости:
специалист
<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'
Вот причина. Начиная с Джерси 2.26, Джерси удалил HK2 как жесткую зависимость. Он создал SPI как фасад для поставщика внедрения зависимостей в форме InjectionManager
и InjectionManagerFactory
. Таким образом, чтобы запустить Джерси, нам нужно иметь реализацию InjectionManagerFactory
. Есть две реализации этого, которые для HK2 и CDI. Зависимость HK2 - это jersey-hk2
, о которой говорят другие.
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>2.26</version>
</dependency>
Зависимость CDI
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-cdi2-se</artifactId>
<version>2.26</version>
</dependency>
Это (jersey-cdi2-se) следует использовать только для сред SE, а не для сред EE.
Джерси внес это изменение, чтобы позволить другим предоставить собственную структуру внедрения зависимостей. У них нет планов по внедрению каких-либо других InjectionManager
, хотя другие пытались реализовать один для Guice.
Выберите, какой DI должен ввести материал в Джерси:
Spring 4:
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-spring4</artifactId>
</dependency>
Spring 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>
Снизить версию трикотажа в pom.xml измените тег 2,26-b04 в 2,26-B03
Единственный способ, которым я мог это решить, - это:
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>
Таким образом, только если я добавил jersey-container-servlet
и jersey-hk2
, он будет работать без ошибок
У меня та же проблема. Я добавил последнюю зависимость jersey-hk2 и работает как шарм.
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
</dependency>
Да, это от последней версии с пятницы 19-го мая. Я просто изменил свою версию в Maven на более старую, и теперь она отлично работает.
Насколько я вижу, зависимости изменились между 2.26-b03 и 2.26-b04 (HK2 был перенесен из компиляции в testCompile)... может быть некоторое изменение в зависимостях Джерси, которые еще не завершены (или которые приводят к ошибке).
Однако сейчас простое решение - придерживаться старой версии: -)
Вот новая зависимость (август 2017 года)
<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.core/jersey-common -->
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-common</artifactId>
<version>2.0-m03</version>
</dependency>