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.jar
yang 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.
sumber
Jawaban:
Tambahkan ketergantungan ini:
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.
sumber
Jersey 2.26 dan yang lebih baru tidak kompatibel dengan versi yang lebih lama. Alasan di balik itu telah dinyatakan dalam catatan rilis :
Adapun saat ini seseorang harus menggunakan dependensi berikut:
Maven
Gradle
sumber
Ini alasannya. Mulai dari Jersey 2.26, Jersey menghapus HK2 sebagai ketergantungan keras . Itu menciptakan SPI sebagai fasad untuk penyedia injeksi ketergantungan, dalam bentuk
InjectionManager
danInjectionManagerFactory
. Jadi untuk menjalankan Jersey, kita perlu memiliki implementasiInjectionManagerFactory
. Ada dua implementasi dari ini, yaitu untuk HK2 dan CDI . Ketergantungan HK2jersey-hk2
yang dibicarakan orang lain.Ketergantungan CDI adalah
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 .sumber
Pilih DI mana untuk menyuntikkan barang ke Jersey:
Musim semi 4:
Spring 3:
HK2:
sumber
jersey-spring
integrasi masih menggunakan jembatan HK2 di bawah tenda untuk membuatnya bekerja.Satu-satunya cara saya bisa menyelesaikannya adalah melalui:
org.glassfish.jersey.core server-jersey $ {jersey-2-versi}
Jadi, hanya jika saya menambahkan
jersey-container-servlet
danjersey-hk2
menjalankannya tanpa kesalahansumber
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 :-)
sumber
Ini adalah ketergantungan baru (Agustus 2017)
sumber