Вопрос-ответ

Jersey stopped working with InjectionManagerFactory not found

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>
java tomcat