programing

Jersey가 InjectionManagerFactory를 찾을 수 없는 상태로 작업을 중지했습니다.

kingscode 2022. 7. 14. 21:57
반응형

Jersey가 InjectionManagerFactory를 찾을 수 없는 상태로 작업을 중지했습니다.

Tomcat 8.5.11에서 Jersey API 실행 중 아래 오류가 발생하여 API가 중지되었습니다.

HTTP Status 500 - Servlet Jersey REST Service의 Servlet.init() 예외 발생

예외 보고서 유형

서블릿 저지 REST 서비스에 대한 메시지 Servlet.init() 예외 발생

description 서버에 내부 오류가 발생하여 이 요청을 수행할 수 없습니다.

예외.

javax.servlet.Servlet Exception:Servlet Jersey REST Service의 Servlet.init()가 예외 org.apache.catalina를 슬로우했습니다.오센티케이터오센티케이터 베이스호출(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.코요테 어댑터service(CoyoteAdapter.java:349) org.apache.coyote.http11.Http11 프로세서service(Http11Processor.java:783) org.apache.coyote.Abstract Processor Light.process(Abstract Processor Light.java:66) org.apache.coyote.Abstract Protocol$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.Task Thread $ Wraping Runnable . run ( Task Thread . java : 61) java . lang 。Thread.run(Thread.java:745)

근본 원인

java.displaces를 클릭합니다.InlawalStateException:InjectionManagerFactory를 찾을 수 없습니다. org.glassfish.jersey.내부의.inject.Injections.lookupInjection Manager Factory(Injections.java:97) org.glassfish.jersey.내부의.inject.Injections.createInjection Manager(Injections.java:89) org.glassfish.jersey.server.ApplicationHandler.(ApplicationHandler.java:282) org.glassfish.jersey.servlet.웹 컴포넌트(Web Component.java:335) org.glassfish.jersey.servlet.Servlet Container.init(Servlet Container.java:178) org.glassfish.jersey.servlet.Servlet Container.init(Servlet Container.java:370) javax.servlet.Generic Servlet.init(Generic Servlet.java:158) org.apache.catalina.오센티케이터오센티케이터 베이스호출(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.코요테 어댑터service(CoyoteAdapter.java:349) org.apache.coyote.http11.Http11 프로세서service(Http11Processor.java:783) org.apache.coyote.Abstract Processor Light.process(Abstract Processor Light.java:66) org.apache.coyote.Abstract Protocol$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.Task Thread $ Wraping Runnable . run ( Task Thread . java : 61) java . lang 。Thread.run(Thread.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 버전에서 작동했습니다.

다음 종속성 추가:

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

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

Jersey Dependency 버전을 혼용하지 마십시오.이 답변에는 "2.28" 버전이 나와 있지만 다른 Jersey 종속성 버전이 무엇이든 사용하십시오.

Jersey 2.26 이후는 이전 버전과 하위 호환성이 없습니다.그 이유는 릴리즈 노트에 기재되어 있습니다.

유감스럽게도 2.26에서는 하위 호환성이 없는 변경을 할 필요가 있었습니다.구체적으로 Jersey만의 리액티브 클라이언트 API는 완전히 없어져 더 이상 지원할 수 없습니다.JAX-RS 2.1에서 도입된 것과 상충됩니다(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.inject:jersey-hk2:2.26'

이유는 이렇다.Jersey 2.26을 시작으로 Jersey는 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 환경에는 사용하지 마십시오.

저지는 다른 사람들이 그들만의 의존성 주입 프레임워크를 제공할 수 있도록 하기 위해 이 변경을 했다.은 다른 어떤 있지 InjectionManagers, 그러나 다른 사람들은 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.core jersey-server ${vsion-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가 컴파일에서 test Compile로 이동됨).저지 의존성에 아직 완료되지 않은(또는 버그로 이어지는) 변화가 있을 수 있습니다.

다만, 현시점에서는, 간단한 해결책은, 구버전을 고수하는 것입니다:-)

새로운 의존관계(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>

언급URL : https://stackoverflow.com/questions/44088493/jersey-stopped-working-with-injectionmanagerfactory-not-found

반응형