Джерсі перестав працювати з InjectionManagerFactory не знайдено


161

Я отримую нижче помилку під час запуску API Jersey в Tomcat 8.5.11, через що мій API припиняється:

HTTP Status 500 - Servlet.init () для сервлетів Jersey REST Service кинув виняток

тип звіту про виключення

повідомлення Servlet.init () для сервлета Jersey REST Service кинув виняток

Опис Сервер зіткнувся з внутрішньою помилкою, яка не дозволила йому виконати цей запит.

виняток

javax.servlet.ServletException: Servlet.init () для сервлета Jersey REST Service кинув виняток org.apache.catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.javaнатап. java: 79) org.apache.catalina.valves.Ab АбстракціяAccessLogValve.invoke (AbstractAccessLogValve.java:624) org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:349) org.apache.co11t. сервіс (Http11Processor.java:783) org.apache.coyote.Ab абстрактProcessorLight.process (AbstractProcessorLight.java:66) org.apache.coyote.Ab абстрактProtocol $ ConnectionHandler.process (AbstractProtocol.java:798) org.apache.cp 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 (ThreadPoolExecc.a.a17). теми.TaskThread $ WrappingRunnable.run (TaskThread.java:61) java.lang.Thread.run (Thread.java:745)

першопричина

java.lang.IllegalStateException: InjectionManagerFactory не знайдено. org.glassfish.jersey.internal.inject.Injections.lookupInjectionManagerFactory (Injections.java:97) org.glassfish.jersey.internal.inject.Injections.createInjectionManager (Injections.java:89) org.glassfish.jersey.server.ApplicationHhl (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.javaната7474) org.achevalval.ca.che. 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 року з’явилася нова версія майки - перевірити, чи це проблема, і в мене зараз така ж проблема
Роман Кеслер


Цей підручник допоміг мені виправити цю проблему 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", але використовуйте будь-яку версію вашої іншої версії залежності від Джерсі.


2
Працював для мене з версією 2,26 випуску. Не хотіли використовувати бета-версії у виробничому коді.
сагани

2
Дякую, це правильна відповідь. Працює з 2,26
маріо


2
Це було для мене - версія 2.28.
абсміти

Що для мене було химерним, це те, що він працював, а потім він припинив свою роботу, Доки я не зробив вищевказане включення відповідно до цієї посади. Так чи інакше, дякую. Моя основна версія була 2,30, а моя ін'єкційна версія, як вище, тобто 2,28.
Бізер

127

Джерсі 2.26 і новіші не сумісні з попередніми версіями. Причина цього була зазначена в примітках до випуску :

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

Ще одна більша зміна коду Джерсі - це спроба зробити ядро ​​Джерсі незалежним від будь-якої конкретної системи введення. Як ви могли б зараз, Джерсі 2.x досить сильно залежав від HK2, що іноді спричиняє проблеми (особливо при роботі на інших контейнерах для ін'єкцій. Джерсі тепер визначає, що це власний фасад для ін'єкцій , який при правильній реалізації замінює всі внутрішня ін'єкція Джерсі.


Наразі слід використовувати такі залежності:

Мейвен

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

Градле

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


11
Зітхніть ... чому б Джерсі не
накинув

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 для уточнення трикотажу-cdi2-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>

2
Це не так просто. Ви не можете просто вимкнути HK2 для Spring. jersey-springІнтеграції все ще використовує ¯hk2 міст під капотом , щоб змусити його працювати.
Пол Самсота

2

Єдиний спосіб я міг вирішити це через:

org.glassfish.jersey.core jersey-сервер $ {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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.