Jersey가 InjectionManagerFactory를 찾을 수 없습니다. 요청을 수행하지 못하게하는 내부 오류가

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 버전으로 작동했습니다.



답변

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

<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 종속 버전이 무엇이든 사용하십시오.


답변

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'

답변

그 이유가 있습니다. 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 용으로 구현하려고 시도 했지만 다른 구현 계획은 없습니다 .


답변

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>

답변

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

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오류없이 실행하는 경우에만


답변

2.26-b03과 2.26-b04 사이에 종속성이 변경된 것을 볼 수있는 한 (HK2는 컴파일에서 testCompile로 이동했습니다) 아직 완료되지 않은 저지 종속성에 약간의 변화가있을 수 있습니다 (또는 버그).

그러나 현재 간단한 해결책은 이전 버전을 고수하는 것입니다 🙂


답변

새로운 종속성은 다음과 같습니다 (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>