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


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

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

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

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

описание сервер обнаружил внутреннюю ошибку, которая предотвратила его от выполнения этой просьбы.

исключение

javax.сервлет.ServletException: Сервлет.init () для сервлета Джерси отдыха Служба выбросила исключение орг.апаш.Каталина.удостоверение.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.java: 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) орг.стеклянная рыба.Джерси.сервлет.WebComponent.(WebComponent.java:335) орг.стеклянная рыба.Джерси.сервлет.ServletContainer.init (ServletContainer.java: 178) орг.стеклянная рыба.Джерси.сервлет.ServletContainer.init (ServletContainer.java:370) класса javax.сервлет.GenericServlet.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.java: 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. Сосуд файл развертывается в папку Tomcat под WEB-INF/lib

что здесь может быть не так? Сценарий gradle работал последние несколько месяцев с той же версией Tomcat.

8 74

8 ответов:

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

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

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

cf. https://stackoverflow.com/a/44536542/1070215

Джерси 2.26 и более новые не совместимы со старыми версиями. Причина этого была изложена в заметки:

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

еще одно большое изменение в коде Джерси-это попытка сделать ядро Джерси независимой от каких-либо конкретных рамках инъекций. Как вы могли бы сейчас, Джерси 2.х (и был!) довольно сильно зависит от 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>

ш

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

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

выберите, какой DI вводить материал в Джерси:

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