Jersey перестал работать с InjectionManagerFactory, не найден
Я получаю приведенную ниже ошибку при запуске моего Jersey API в Tomcat 8.5.11, что приводит к остановке моего API:
HTTP Status 500 - Servlet.init() для REST-сервиса Servlet Джерси выдал исключение
введите отчет об исключении
сообщение Servlet.init() для REST-сервиса Servlet Jersey выдало исключение
описание Сервер столкнулся с внутренней ошибкой, которая не позволила ему выполнить этот запрос.
исключение
javax.servlet.Исключение ServletException: Servlet.init() для REST-сервиса Servlet Джерси выдал исключение 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.потоки.TaskThread$WrappingRunnable.run(TaskThread.java:61) java.lang.Thread.run(Thread.java:745)
основная причина
java.lang.Исключение IllegalStateException: InjectionManagerFactory не найден. org.glassfish.jersey.internal.inject.Инъекции.lookupInjectionManagerFactory(Injections.java:97) org.glassfish.jersey.internal.inject.Injections.createInjectionManager(Injections.java:89) org.glassfish.jersey.server.Обработчик приложений.(ApplicationHandler.java: 282) org.glassfish.джерси.сервлет.ВебКомпонент.(WebComponent.java: 335) org.glassfish.джерси.сервлет.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.потоки.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.
Переведено автоматически
Ответ 1
Добавьте эту зависимость:
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>2.28</version>
</dependency>
ср. https://javalang.ru/a/44536542/1070215
Убедитесь, что вы не перепутали версии зависимостей от Jersey. В этом ответе указана версия "2.28", но используйте любую версию, которая соответствует вашим другим версиям зависимостей от Jersey.
Ответ 2
Jersey 2.26 и новее обратно несовместимы со старыми версиями. Причина этого была указана в примечаниях к выпуску:
К сожалению, возникла необходимость внести обратно несовместимые изменения в 2.26. Конкретно jersey-проприетарный реактивный клиентский API полностью удален и больше не может поддерживаться - он конфликтует с тем, что было введено в JAX-RS 2.1 (это цена за Jersey - "spec playground ..").
Еще одним большим изменением в коде Jersey является попытка сделать ядро Jersey независимым от какого-либо конкретного фреймворка для внедрения. Как вы уже поняли, Jersey 2.x довольно сильно зависит (был!) От HK2, что иногда вызывает проблемы (особенно при запуске в других контейнерах для инъекций. Jersey теперь определяет свой собственный фасад внедрения, который при правильной реализации заменяет все внутренние инъекции Джерси.
На данный момент следует использовать следующие зависимости:
Maven
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>2.26</version>
</dependency>
Gradle
compile 'org.glassfish.jersey.inject:jersey-hk2:2.26'
Ответ 3
Вот причина. Начиная с версии Jersey 2.26, Jersey удалил HK2 как жесткую зависимость. Он создал SPI в качестве фасада для поставщика внедрения зависимостей в форме InjectionManager
и InjectionManagerFactory
. Итак, для запуска Jersey нам нужна реализация 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.
Jersey внес это изменение, чтобы позволить другим пользователям предоставлять свою собственную платформу внедрения зависимостей. У них нет никаких планов по внедрению каких-либо других InjectionManager
ов, хотя другие предпринимали попытки реализовать один для Guice.
Ответ 4
Выберите, какой DI вводить в Jersey:
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>