Jersey가 InjectionManagerFactory를 찾을 수 없습니다.


161

Tomcat 8.5.11에서 Jersey API를 실행하는 동안 API가 중지되는 오류가 발생합니다.

HTTP 상태 500-Servlet Jersey REST 서비스의 Servlet.init ()에서 예외가 발생했습니다.

예외 보고서 유형

servlet Jersey REST 서비스에 대한 Servlet.init () 메시지에서 예외가 발생했습니다.

설명 서버에서이 요청을 수행하지 못하게하는 내부 오류가 발생했습니다.

예외

javax.servlet.ServletException : servlet Jersey REST 서비스의 Servlet.init ()가 예외를 던졌습니다. 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. threads.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.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.java:474) org.apache.catalina.valves. 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에 새로운 버전의 저지가있는 것을 본다-이것이 문제인지 확인한다, 나는 현재 같은 문제가있다
Roman Kesler


이 튜토리얼은이 문제를 해결하는 데 도움이되었습니다. crunchify.com/…
JesseBoyd

답변:


316

이 의존성을 추가하십시오 :

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

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

Jersey 종속성 버전을 혼합하지 마십시오. 이 답변은 "2.28"버전이지만 다른 Jersey 종속 버전이 무엇이든 사용하십시오.


2
2.26 릴리스 버전으로 저를 위해 일했습니다. 프로덕션 코드에서 베타 버전을 사용하고 싶지 않았습니다.
saganas

2
감사합니다. 정답입니다. 작동 2.26
마리오


2
이것은 나를위한 것입니다-버전 2.28.
absmiths

나를 위해 기괴한 것은 그것이 작동하고 있었고,이 게시물에 따라 위의 포함을 할 때까지 작동을 멈췄습니다. 어쨌든 고마워 내 핵심 버전은 2.30이고 위의 주입 버전은 2.28입니다.
Beezer

127

Jersey 2.26 이상은 이전 버전과 호환되지 않습니다. 그 이유는 릴리스 노트 에 명시되어 있습니다 .

불행히도 2.26에서는 이전 버전과 호환되지 않는 변경이 필요했습니다. 구체적으로 저지 고유의 반응성 클라이언트 API는 완전히 사라져 더 이상 지원 될 수 없습니다. 이는 JAX-RS 2.1에 도입 된 것과 충돌합니다.

Jersey 코드의 또 다른 큰 변화는 Jersey를 특정 주입 프레임 워크와 독립적으로 만드는 시도입니다. 지금과 같이 Jersey 2.x는 HK2에 매우 밀접하게 의존하므로 문제가 발생할 수 있습니다 (다른 주입 컨테이너에서 실행할 때 특히 발생합니다. Jersey는 이제 자체 주입 파사드를 정의하여 올바르게 구현하면 모든 것을 대체합니다. 내부 저지 주입.


지금은 다음과 같은 종속성을 사용해야합니다.

메이븐

<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 메이저 버전과 동기화하기를 원한다고 생각한다. 그게 나에게 이해가되는 유일한 것입니다.
Paul Samsotha 5

또한 저지 커먼은 수동으로 추가 할 필요가 없습니다 . 이것은 jersey-server에 의해 이미 가져 왔으며, 이는 jersey-container-servlet-core 또는 사용하는 다른 "주요"저지 종속성에 의해 가져와야합니다. 문제의 오류를 제거하기 위해 필요한 필수 종속성은 jersey-hk2 (또는 여기에 언급 된 jersey-cdi2-se )입니다.
Paul Samsotha

@LuisF, 불필요한 저지 공통 종속성을 포함하지 않으면 정확합니다. 이것은 이미 전 이적 의존성입니다.
Paul Samsotha

47

그 이유가 있습니다. Jersey 2.26부터 Jersey는 HK2를 어려운 종속성 으로 제거했습니다 . 그리고 의존성 주입 프로 바이더의 외관으로 SPI를 InjectionManagerand 형식으로 작성했습니다 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)는 EE 환경이 아닌 SE 환경에만 사용해야합니다.

Jersey는 다른 사람들이 자신의 의존성 주입 프레임 워크를 제공 할 수 있도록이 변경을 수행했습니다. InjectionManager다른 사람들은 Guice 용으로 구현하려고 시도 했지만 다른 구현 계획은 없습니다 .


1
CDI (jersey-cdi2-se)를 사용하려면 META-INF에서 bean.xml 구성이 필요합니다. 그렇지 않으면 다음과 같은 예외가 발생합니다 : java.lang.IllegalStateException : 용접 ENV-000016 : META-INF에서 누락 beans.xml 환경 파일
마르코 몬텔

이 답변은 너무 많은 불일치로 인해 도움이되었습니다. jersey-cdi2-se를 명확히하기위한 +1은 SE에만 사용해야합니다
Daniel Arechiga

11

Jersey에 재료를 주입 할 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 for Spring을 전환 할 수는 없습니다. jersey-spring통합은 여전히 작동하도록 후드 아래 HK2 브리지를 사용합니다.
Paul Samsotha

2

내가 해결할 수있는 유일한 방법은 다음과 같습니다.

org.glassfish.jersey.core 저지 서버 $ {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 년 8 월)

    <!-- 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>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.