Jersey หยุดทำงานกับ InjectionManagerFactory ไม่พบ


161

ฉันได้รับข้อผิดพลาดด้านล่างขณะใช้งาน Jersey API ใน Tomcat 8.5.11 ซึ่งทำให้ API ของฉันหยุดทำงาน:

HTTP Status 500 - Servlet.init () สำหรับ servlet Jersey REST Service แสดงข้อยกเว้น

พิมพ์รายงานข้อยกเว้น

ข้อความ Servlet.init () สำหรับ servlet Jersey REST Service แสดงข้อยกเว้น

คำอธิบายเซิร์ฟเวอร์พบข้อผิดพลาดภายในที่ทำให้ไม่สามารถดำเนินการตามคำขอนี้ได้

ข้อยกเว้น

javax.servlet.ServletException: Servlet.init () สำหรับ servlet Jersey REST Service โยนข้อยกเว้น org.apache.catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.java:474) org.apache.catalina.valves.ElrorReportValve.Valve java: 79) org.apache.catalina.valves.AbstractAccessLogValve.invoke (AbstractAccessLogValve.java:624) org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:349) org.apache.coyote.http service (Http11Processor.java:783) org.apache.coyote.AbstractProcessorLight.process (AbstractProcessorLight.java:66) org.apache.coyote.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.concurrentThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:617) org.apache.tomcat.utache 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) ServletContainer.init (ServletContainer.java:370) javax.servlet.GenericServlet.init (GenericServlet.java:158) org.apache.catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.java:474) 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
ฉันเห็นว่ามี Jersey รุ่นใหม่เมื่อวันที่ 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

ตรวจสอบให้แน่ใจว่าไม่ได้ผสมรุ่นพึ่งพาของคุณ คำตอบนี้บอกว่ารุ่น "2.28" แต่ใช้รุ่นใดก็ได้ที่คุณต้องพึ่งพา Jersey รุ่นอื่น


2
ทำงานสำหรับฉันด้วยรุ่น 2.26 ไม่ต้องการใช้รุ่นเบต้าในรหัสการผลิต
saganas

2
ขอบคุณนี่คือคำตอบที่ถูกต้อง ทำงานร่วมกับ 2.26
มาริโอ

1
ดูคำอธิบายเพิ่มเติมได้ที่
Paul Samsotha

2
นี่มันสำหรับฉัน - รุ่น 2.28
absmiths

สิ่งที่เป็น bizzare สำหรับฉันก็คือมันทำงานได้และจากนั้นก็หยุดทำงานจนฉันได้รวมข้างต้นตามโพสต์นี้ ยังไงก็ตามขอบคุณ รุ่นหลักของฉันคือ 2.30 และรุ่นฉีดของฉันดังกล่าวข้างต้นคือ 2.28
Beezer

127

Jersey 2.26 และใหม่กว่านั้นไม่สามารถใช้กับรุ่นเก่ากว่าได้ เหตุผลเบื้องหลังที่ระบุไว้ในบันทึกย่อประจำรุ่น :

น่าเสียดายที่มีความจำเป็นต้องทำการเปลี่ยนแปลงย้อนหลังใน 2.26 API ไคลเอนต์รีแอกทีฟที่เป็นกรรมสิทธิ์ของนิวเจอร์ซีย์หายไปอย่างสมบูรณ์และไม่สามารถรองรับได้อีกต่อไป - มันขัดแย้งกับสิ่งที่ได้รับการแนะนำใน JAX-RS 2.1 (นั่นคือราคาสำหรับ Jersey ที่เป็น "สนามเด็กเล่นจำเพาะ .. ")

การเปลี่ยนแปลงครั้งใหญ่อีกครั้งของรหัสเจอร์ซีย์คือความพยายามที่จะทำให้ Jersey core เป็นอิสระจากกรอบการฉีดเฉพาะใด ๆ อย่างที่คุณอาจตอนนี้ Jersey 2.x is (was!) ค่อนข้างแน่นหนาขึ้นกับ HK2 ซึ่งบางครั้งก็ทำให้เกิดปัญหา (โดยเฉพาะเมื่อทำงานบนภาชนะฉีดอื่น ๆตอนนี้ Jersey กำหนดว่าเป็นซุ้มฉีดของตัวเองซึ่งเมื่อติดตั้งอย่างถูกต้อง การฉีดภายใน


สำหรับตอนนี้หนึ่งควรใช้การอ้างอิงต่อไปนี้:

Maven

<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'


11
เฮ้อ ... ทำไม Jersey ถึงไม่ชนกับรุ่นที่ 3.0 ถ้าพวกเขาเปลี่ยนไป ..
เทรเวอร์ลัทธิ

1
@revorism ฉันมีความรู้สึกว่าพวกเขาต้องการให้รุ่นหลักสอดคล้องกับรุ่นหลัก JAX-RS นั่นเป็นสิ่งเดียวที่สมเหตุสมผลสำหรับฉัน
Paul Samsotha

นอกจากนี้เสื้อทั่วไปไม่ใช่ข้อกำหนด (เพื่อเพิ่มด้วยตนเอง ) สิ่งนี้ควรถูกดึงเข้ามาโดยเจอร์ซีย์เซิร์ฟเวอร์ซึ่งควรดึงโดยเจอร์ซีย์คอนเทนเนอร์คอนเทนเนอร์หลักหรือการพึ่งพานิวเจอร์ซีย์ "หลัก" อื่น ๆ ที่คุณใช้ การพึ่งพาที่จำเป็นเพียงอย่างเดียวเพื่อกำจัดข้อผิดพลาดที่เป็นปัญหาคือ Jersey-hk2 (หรือ jersey-cdi2-se ดังที่กล่าวไว้ที่นี่ )
Paul Samsotha

@ LuisF มันจะถูกต้องถ้ามันไม่ได้รวมการพึ่งพาทั่วไปที่ไม่จำเป็นกับย์ นี่เป็นการพึ่งพาสกรรมกริยาแล้ว
Paul Samsotha

47

นี่คือเหตุผล เริ่มต้นจาก 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

Jersey ได้ทำการเปลี่ยนแปลงนี้เพื่ออนุญาตให้ผู้อื่นให้กรอบการฉีดของพวกเขาเอง พวกเขาไม่ได้มีแผนในการดำเนินการอื่น ๆInjectionManagers แต่คนอื่นได้ทำให้ความพยายามที่จะดำเนินการอย่างใดอย่างหนึ่งสำหรับ 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
Daniel Arechiga

11

เลือก DI ที่จะฉีดเนื้อหาลงใน Jersey:

ฤดูใบไม้ผลิ 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 สำหรับฤดูใบไม้ผลิได้ การjersey-springรวมยังคงใช้สะพาน HK2 ภายใต้ประทุนเพื่อให้ทำงานได้
Paul Samsotha

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) ... อาจมีการเปลี่ยนแปลงในการพึ่งพา Jersey ที่ยังไม่เสร็จสมบูรณ์ (หรือสิ่งที่นำไปสู่ แมลง).

อย่างไรก็ตามตอนนี้ทางออกที่ง่ายคือติดกับเวอร์ชันเก่า :-)


-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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.