Jersey berhenti bekerja dengan InjectionManagerFactory tidak ditemukan

161

Saya menerima kesalahan di bawah ketika menjalankan Jersey API saya di Tomcat 8.5.11 yang menyebabkan API saya berhenti:

Status HTTP 500 - Servlet.init () untuk servlet Jersey REST Service memberikan pengecualian

ketik laporan Pengecualian

message Servlet.init () untuk servlet Jersey REST Service memberikan pengecualian

deskripsi Server mengalami kesalahan internal yang mencegahnya memenuhi permintaan ini.

pengecualian

javax.servlet.ServletException: Servlet.init () untuk servlet Jersey REST Service melempar pengecualian org.apache.catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.java:474) org.apache.catalina.valves.ErrorReportValve.vvvvvvvevevealve (errorRve. java: 79) org.apache.catalina.valves.AbstractAccessLogValve.invoke (AbstractAccessLogValve.java:624) org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:349) org.apache.coyote ke http: service (Http11Processor.java:783) org.apache.coyote.AbstractProcessorLight.process (AbstractProcessorLight.java:66) org.apache.coyote.AbstrakProtocol $ ConnectionHandler.process (AbstractProtocol.java:798) org.apache.tomcat.tomcat. net.NioEndpoint $ SocketProcessor.doRun (NioEndpoint.java:1434) org.apache.tomcat.util.net.SocketProcessorBase.jalankan (SocketProcessorBase.java:49) java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142) java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:617) org.apache.tomcat.tomcat. threads.TaskThread $ WrappingRunnable.run (TaskThread.java:61) java.lang.Thread.run (Thread.java:745)

penyebab utama

java.lang.IllegalStateException: InjectionManagerFactory tidak ditemukan. 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:82) 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) syaraf.atal. ErrorReportValve.invoke (ErrorReportValve.java:79) org.apache.catalina.valves.

Aplikasi ini dibuat dengan dependensi berikut dengan 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.+"
    ) }

Unduhan ini jersey-common-2.26-b04.jaryang berisi kelas yang hilang di bawah /org/glassfish/jersey/internal/inject/InjectionManagerFactory. File jar disebarkan ke folder Tomcat di bawahWEB-INF/lib

Apa yang salah di sini? Skrip gradle bekerja beberapa bulan terakhir dengan versi Tomcat yang sama.

Gregor
sumber
1
saya melihat ada versi baru jersey pada 19/05 - periksa apakah ini masalahnya, saya punya masalah yang sama saat ini
Roman Kesler
search.maven.org/…
Roman Kesler
Tutorial ini membantu saya memperbaiki masalah ini crunchify.com/...
JesseBoyd

Jawaban:

316

Tambahkan ketergantungan ini:

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

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

Pastikan untuk tidak mencampur versi ketergantungan Jersey Anda. Jawaban ini mengatakan versi "2.28", tetapi gunakan versi apa pun versi dependensi Jersey Anda yang lain.

cthiebaud
sumber
2
Bekerja untuk saya dengan versi rilis 2.26. Tidak ingin menggunakan versi beta dalam kode produksi.
saganas
2
Terima kasih, ini jawaban yang benar. Bekerja dengan 2,26
mario
1
Lihat juga untuk penjelasan.
Paul Samsotha
2
Ini untuk saya - versi 2.28.
absmith
Apa yang aneh bagi saya adalah bahwa itu berfungsi, dan kemudian berhenti berfungsi SAMPAI saya melakukan inklusi di atas sesuai posting ini. Bagaimanapun terima kasih. Versi inti saya adalah 2,30 dan versi suntikan saya seperti di atas yaitu 2,28.
Beezer
127

Jersey 2.26 dan yang lebih baru tidak kompatibel dengan versi yang lebih lama. Alasan di balik itu telah dinyatakan dalam catatan rilis :

Sayangnya, ada kebutuhan untuk membuat perubahan mundur yang tidak kompatibel di 2.26. API klien reaktif jersey-eksklusif benar-benar hilang dan tidak dapat didukung lagi - itu bertentangan dengan apa yang diperkenalkan di JAX-RS 2.1 (itulah harga untuk Jersey menjadi "taman bermain spec ..").

Perubahan lain yang lebih besar dalam kode Jersey adalah upaya untuk membuat inti Jersey independen dari kerangka kerja injeksi tertentu. Seperti yang mungkin Anda lakukan sekarang, Jersey 2.x adalah (dulu!) Sangat tergantung pada HK2, yang kadang-kadang menyebabkan masalah (khususnya ketika berjalan pada wadah injeksi lain. Jersey sekarang mendefinisikan fasad injeksi miliknya sendiri , yang, ketika diimplementasikan dengan benar, menggantikan semua Injeksi Jersey internal.


Adapun saat ini seseorang harus menggunakan dependensi berikut:

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'
wypieprz
sumber
Lihat juga masalah Tidak dapat memutakhirkan dari 2.25.1 ke 2.26
Grigory Kislin
11
Huh ... kenapa Jersey tidak
menaikkan
1
@trevorism Saya merasa mereka ingin menjaga versi utama tetap sinkron dengan versi utama JAX-RS. Itulah satu-satunya hal yang masuk akal bagi saya.
Paul Samsotha
Jersey-umum juga bukan keharusan (untuk menambahkan secara manual ). Ini harus sudah ditarik oleh jersey-server, yang harus ditarik oleh jersey-container-servlet-core atau ketergantungan jersey "utama" lainnya yang Anda gunakan. Satu-satunya ketergantungan yang diperlukan untuk menghilangkan kesalahan tersebut adalah jersey-hk2 (atau jersey-cdi2-se, seperti yang disebutkan di sini ).
Paul Samsotha
@LuisF, Itu akan benar jika itu tidak termasuk dependensi umum jersey yang tidak perlu. Ini sudah menjadi ketergantungan transitif.
Paul Samsotha
47

Ini alasannya. Mulai dari Jersey 2.26, Jersey menghapus HK2 sebagai ketergantungan keras . Itu menciptakan SPI sebagai fasad untuk penyedia injeksi ketergantungan, dalam bentuk InjectionManagerdan InjectionManagerFactory. Jadi untuk menjalankan Jersey, kita perlu memiliki implementasi InjectionManagerFactory. Ada dua implementasi dari ini, yaitu untuk HK2 dan CDI . Ketergantungan HK2 jersey-hk2yang dibicarakan orang lain.

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

Ketergantungan CDI adalah

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

Ini (jersey-cdi2-se) hanya boleh digunakan untuk lingkungan SE dan bukan lingkungan EE.

Jersey membuat perubahan ini untuk memungkinkan orang lain menyediakan kerangka kerja injeksi ketergantungan mereka sendiri. Mereka tidak memiliki rencana untuk menerapkan yang lain InjectionManager, meskipun yang lain telah berupaya menerapkan satu untuk Guice .

Paul Samsotha
sumber
1
Perhatikan bahwa menggunakan CDI (jersey-cdi2-se) memerlukan konfigurasi bean.xml di META-INF. Jika tidak, pengecualian berikut akan dilemparkan: java.lang.IllegalStateException: WELD-ENV-000016: File Missing beans.xml di META-INF
Marco Montel
Jawaban ini membantu saya dengan begitu banyak ketidakkonsistenan, +1 untuk mengklarifikasi jersey-cdi2-se hanya boleh digunakan untuk SE
Daniel Arechiga
11

Pilih DI mana untuk menyuntikkan barang ke Jersey:

Musim semi 4:

<dependency>
  <groupId>org.glassfish.jersey.ext</groupId>
  <artifactId>jersey-spring4</artifactId>
</dependency>

Spring 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>
broc.seib
sumber
2
Ini tidak semudah itu. Anda tidak bisa hanya mengganti HK2 untuk Musim Semi. The jersey-springintegrasi masih menggunakan jembatan HK2 di bawah tenda untuk membuatnya bekerja.
Paul Samsotha
2

Satu-satunya cara saya bisa menyelesaikannya adalah melalui:

org.glassfish.jersey.core server-jersey $ {jersey-2-versi}

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

Jadi, hanya jika saya menambahkan jersey-container-servletdan jersey-hk2menjalankannya tanpa kesalahan

Johannes Jander
sumber
0

Sejauh yang saya bisa lihat dependensi telah berubah antara 2.26-b03 dan 2.26-b04 (HK2 dipindahkan dari kompilasi ke testCompile) ... mungkin ada beberapa perubahan pada dependensi jersey yang belum selesai (atau yang mengarah ke bug).

Namun, sekarang solusi sederhana adalah tetap menggunakan versi yang lebih lama :-)

Nikolaus Krismer
sumber
-2

Ini adalah ketergantungan baru (Agustus 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>
Ricardo Rossini
sumber