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

161

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

HTTP Status 500 - Servlet.init () для сервлета Джерси. Служба REST вызвала исключение.

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

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

description Сервер обнаружил внутреннюю ошибку, которая не позволила ему выполнить этот запрос.

исключение

javax.servlet.ServletException: Servlet.init () для сервлета Джерси Служба REST вызвала исключение org.apache.catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.java:474) org.apache.catalina.valves.ErrorReportValve.ReportValve.inport Java: 79) org.apache.catalina.valves.AbstractAccessLogValve.invoke (AbstractAccessLogValve.java:624) org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:349) org.apache.cocessorHp служба (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.Выполните (SocketProcessorBase.java:49) java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142) java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:6til.catg.org) или threads.TaskThread $ WrappingRunnable.run (TaskThread.java:61) java.lang.Thread.run (Thread.java:745)

основная причина

java.lang.IllegalStateException: InjectionManagerFactory не найден. org.glassfish.jersey.internal.inject.Injection.lookupInjectionManagerFactory (Injection.java:97) org.glassfish.jersey.internal.inject.Injection.createInjectionManager (Injection.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.jalap.cat. Org. ErrorReportValve.invoke (ErrorReportValve.java:79) org.apache.catalina.valves.

Приложение построено со следующими зависимостями с 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
я вижу, что 19/05 была новая версия трикотажа - проверьте, не в этом ли проблема, у меня та же проблема в настоящее время
Роман Кеслер
search.maven.org/…
Роман Кеслер
Это руководство помогло мне исправить эту проблему crunchify.com/...
JesseBoyd

Ответы:

316

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

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

ср https://stackoverflow.com/a/44536542/1070215

Удостоверьтесь, что не перепутали свои версии зависимости Джерси. В этом ответе указана версия «2.28», но используйте любую версию, в которой находятся ваши другие версии зависимостей на Джерси.

cthiebaud
источник
2
Работал у меня с 2.26 выпуска версии. Не хотел использовать бета-версии в рабочем коде.
саганы
2
Спасибо, это правильный ответ. Работает с 2.26
Mario
1
Смотрите также для объяснения.
Пол Самсота
2
Это было для меня - версия 2.28.
Абсмиты
Что было странным для меня, так это то, что он работал, а потом перестал работать, пока я не сделал вышеуказанное включение согласно этому посту. Во всяком случае, спасибо. Моя базовая версия была 2.30, а моя инъекционная версия, как указано выше, т.е. 2.28.
Бизер
127

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

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

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


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

специалист

<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'
wypieprz
источник
Также смотрите проблему Не удается обновить с 2.25.1 до 2.26
Григорий Кислин
11
Вздох ... почему бы Джерси не поднять версию до 3.0, если они вносят
решительные
1
@trevorism У меня такое чувство, что они хотят синхронизировать основную версию с основной версией JAX-RS. Это единственное, что имеет смысл для меня.
Пол Самсота
Также джерси-общее не является обязательным требованием (для добавления вручную ). Это должно быть уже извлечено сервером jersey, который должен быть обработан ядром jersey-container-servlet-core или любой другой зависимостью «основного» джерси, которую вы используете. Единственная необходимая зависимость, чтобы избавиться от рассматриваемой ошибки - это jersey-hk2 (или jersey-cdi2-se, как упомянуто здесь ).
Пол Самсота
@LuisF, было бы правильно, если бы в него не входила ненужная общая зависимость от джерси. Это уже переходная зависимость.
Пол Самсота
47

Вот причина. Начиная с Джерси 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 .

Пол Самсота
источник
1
Обратите внимание, что использование CDI (jersey-cdi2-se) требует конфигурации bean.xml в META-INF. В противном случае будет выдано следующее исключение: java.lang.IllegalStateException: WELD-ENV-000016: отсутствует файл beans.xml в META-INF
Marco Montel
Этот ответ помог мне с таким количеством несоответствий, +1 для уточнения jersey-cdi2-se следует использовать только для SE
Даниэль Аречига
11

Выберите, какой 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>
broc.seib
источник
2
Это не так просто. Вы не можете просто выключить HK2 для весны. jersey-springИнтеграции все еще использует ¯hk2 мост под капотом , чтобы заставить его работать.
Пол Самсота
2

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

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

Йоханнес Яндер
источник
0

Насколько я вижу, зависимости изменились между 2.26-b03 и 2.26-b04 (HK2 был перемещен из компиляции в testCompile) ... возможно, есть некоторые изменения в зависимостях джерси, которые еще не были завершены (или которые приводят к Жук).

Однако сейчас простое решение - придерживаться более старой версии :-)

Николаус Крисмер
источник
-2

Вот новая зависимость (август 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>
Рикардо Россини
источник