Джерси перестал работать с InjectionManagerFactory не найден



Я получаю ниже ошибку при запуске моего API Джерси в Tomcat 8.5.11, которая вызывает остановку моего API:




HTTP Status 500 - сервлет.метод init() сервлета для обслуживания Джерси остальное выбросил
исключение



Тип отчета об исключении



Сервлет Сообщений.метод init() сервлета для обслуживания Джерси остальное выбросил исключение



Описание сервер столкнулся с внутренней ошибкой, которая помешала ему
от выполнения этой просьбы.



Исключение



Явакс.сервлет.ServletException: Сервлет.init () для сервлета Джерси REST
Служба выбросила исключение
орг..апаш.Каталина.удостоверение.AuthenticatorBase.invoke(AuthenticatorBase.java: 474)
орг..апаш.Каталина.трубопроводная арматура.ErrorReportValve.invoke (ErrorReportValve.Ява: 79)
орг..апаш.Каталина.трубопроводная арматура.AbstractAccessLogValve.invoke (AbstractAccessLogValve.java: 624)
орг..апаш.Каталина.соединитель.Койотадаптер.сервис (CoyoteAdapter.java: 349)
орг..апаш.койот.http11.Http11Processor.сервис (Http11Processor.java: 783)
орг..апаш.койот.AbstractProcessorLight.процесс (AbstractProcessorLight.Ява: 66)
орг..апаш.койот.AbstractProtocol$ConnectionHandler.процесс (AbstractProtocol.java: 798)
орг."Апач".котяра.утиль.чистая.NioEndpoint$SocketProcessor.doRun(NioEndpoint.Ява:1434)
орг."Апач".котяра.утиль.чистая.SocketProcessorBase.запустить(SocketProcessorBase.Ява:49)
Ява.утиль.параллельный.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.Ява: 1142)
Ява.утиль.параллельный.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java: 617)
орг..апаш.кот.утиль.нити.TaskThread$WrappingRunnable.run (TaskThread.Ява: 61)
Ява.яз..Нить.выполнения(резьба.java: 745)



Первопричина



Java.яз..IllegalStateException: InjectionManagerFactory не найден.
орг..стеклянная рыба.Джерси.внутренний.впрыскивать.Введение препарата.lookupInjectionManagerFactory (инъекции.java: 97)
орг..стеклянная рыба.Джерси.внутренний.впрыскивать.Введение препарата.createInjectionManager (инъекции.Ява: 89)
орг..стеклянная рыба.Джерси.сервер.ApplicationHandler.(ApplicationHandler.java: 282)
орг..стеклянная рыба.Джерси.сервлет.Вебкомпонент.(Вебкомпонент.java: 335)
орг..стеклянная рыба.Джерси.сервлет.ServletContainer.init (ServletContainer.java: 178)
орг..стеклянная рыба.Джерси.сервлет.ServletContainer.init (ServletContainer.java: 370)
класса javax.сервлет.Дженерик сервлет.init (GenericServlet.java: 158)
орг..апаш.Каталина.удостоверение.AuthenticatorBase.invoke(AuthenticatorBase.java: 474)
орг..апаш.Каталина.трубопроводная арматура.ErrorReportValve.invoke (ErrorReportValve.Ява: 79)
орг..апаш.Каталина.трубопроводная арматура.AbstractAccessLogValve.invoke (AbstractAccessLogValve.java: 624)
орг..апаш.Каталина.соединитель.Койотадаптер.сервис (CoyoteAdapter.java: 349)
орг..апаш.койот.http11.Http11Processor.сервис (Http11Processor.java: 783)
орг..апаш.койот.AbstractProcessorLight.процесс (AbstractProcessorLight.Ява: 66)
орг..апаш.койот.AbstractProtocol$ConnectionHandler.процесс (AbstractProtocol.java: 798)
орг."Апач".котяра.утиль.чистая.NioEndpoint$SocketProcessor.doRun(NioEndpoint.Ява:1434)
орг."Апач".котяра.утиль.чистая.SocketProcessorBase.запустить(SocketProcessorBase.Ява:49)
Ява.утиль.параллельный.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.Ява: 1142)
Ява.утиль.параллельный.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java: 617)
орг..апаш.кот.утиль.нити.TaskThread$WrappingRunnable.run (TaskThread.Ява: 61)
Ява.яз..Нить.выполнения(резьба.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.

547   8  

8 ответов:

У меня та же проблема, после понижения до версии, развернутой в марте (2.26-b03) все возвращается в норму, надеюсь, это поможет

Добавьте эту зависимость:

<dependency>
    <groupId>org.glassfish.jersey.inject</groupId>
    <artifactId>jersey-hk2</artifactId>
</dependency>

См. https://stackoverflow.com/a/44536542/1070215

Jersey 2.26 и новее не имеют обратной совместимости со старыми версиями. Причина этого была изложена в примечаниях к выпуску :

К сожалению, возникла необходимость внести обратно несовместимые изменения в 2.26. Конкретно Джерси-проприетарный реактивный клиент API является полностью исчезла и больше не может поддерживаться - она конфликтует с что было введено в JAX-RS 2.1 (это цена за то, что Джерси - специальная площадка..").

Еще один большее изменение в коде Джерси-это попытка сделать ядро Джерси независимо от каких-либо конкретных рамок инъекций. Как вы могли бы сейчас, Джерси 2.x есть (был!) довольно сильно зависит от HK2, который иногда причины проблем (esp. при работе на других инъекционных контейнерах. Джерси теперь определяет свой собственный фасад инъекции , который при реализации правильно, заменяет все внутренние Джерси инъекции.


На данный момент следует использовать следующее: зависимости:

Maven

<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-common</artifactId>
<version>2.26</version>

<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>2.26</version>

Gradle

compile 'org.glassfish.jersey.core:jersey-common:2.26'
compile 'org.glassfish.jersey.inject:jersey-hk2:2.26'

Вот в чем причина. Начиная с Джерси 2.26, Джерси удалил HK2 как a тяжело зависимость. Он создал 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.

Джерси внес это изменение, чтобы позволить другим обеспечить свою собственную структуру внедрения зависимостей. У них нет никаких планов по реализации каких-либо других InjectionManagers, хотя другие сделали попытки реализовать один для Guice.

Выберите, какой Ди вводить вещество в Джерси:

Весна 4:

<dependency>
  <groupId>org.glassfish.jersey.ext</groupId>
  <artifactId>jersey-spring4</artifactId>
</dependency>

Весна 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>

Единственный способ, которым я мог решить эту проблему, был через:

Орг.стеклянная рыба.Джерси.ядро Джерси-сервер ${Джерси-2-версия}

<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, он будет работать без ошибок

Насколько я могу видеть, зависимости изменились между 2.26-b03 и 2.26-b04 (HK2 был перемещен из compile в 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>

Comments

    Ничего не найдено.