Tomcat 8.5.11でJersey APIを実行中に以下のエラーが表示され、APIが停止します。
HTTPステータス500 - サーブレットJerseyのServlet.init()RESTサービスが例外をスローしました
タイプ例外レポート
サーブレットJerseyのメッセージServlet.init()RESTサービスが例外をスローしました
説明サーバーで内部エラーが発生したため、この要求を実行できませんでした。
例外
javax.servlet.ServletException:サーブレットのServlet.init()Jersey REST Serviceが例外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:79) 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)o rg.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.Injection.lookupInjectionManagerFactory(Injection.Java:97)org.glassfish.jersey.internal.inject.Injection.createInjectionManager(Injection.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.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) org.Apache.Tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.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
をダウンロードします。 jarファイルはWEB-INF/lib
の下のTomcatフォルダーにデプロイされます。
ここで何が間違っている可能性がありますか? gradleスクリプトは、同じTomcatバージョンで、ここ数カ月間働きました。
私は同じ問題を抱えています、3月に展開されたバージョン(2.26-b03)にダウングレードした後、すべてが正常に戻ったので、それが助けになることを願っています
この依存関係を追加してください。
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>2.28</version>
</dependency>
Jersey 2.26以降には、古いバージョンとの下位互換性がありません。その背後にある理由は リリースノート で述べられています:
残念ながら、2.26では後方互換性のない変更を行う必要がありました。具体的には、ジャージ独自のリアクティブクライアントAPIは完全に削除され、サポートされなくなりました-JAX-RS 2.1で導入されたものと競合します(ジャージーの価格は「仕様の遊び場」です)。
Jerseyコードのもう1つの大きな変更は、特定のインジェクションフレームワークからJerseyコアを独立させる試みです。ご存知のように、Jersey 2.xはHK2に非常に密接に依存しているため、問題が発生することがあります(特に、他の注入コンテナーで実行する場合。Jerseyは独自の注入ファサードを定義します) 。適切に実装すると、すべての内部Jersey注入が置き換えられます。
今のところ、次の依存関係を使用する必要があります。
Maven
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-common</artifactId>
<version>2.26</version>
</dependency>
<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'
これが理由です。 Jersey 2.26以降、JerseyはHK2を hard 依存関係として削除しました。依存性注入プロバイダのファサードとして、SPIをInjectionManager
およびInjectionManagerFactory
の形式で作成しました。したがって、Jerseyを実行するには、InjectionManagerFactory
の実装が必要です。これには HK2とCDI の2つの実装があります。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は、他の人が独自の依存性注入フレームワークを提供できるようにするためにこの変更を行いました。他の人が Guice のためのものを実装しようとする試みをしています)をしていますが、彼らは他のどの_ InjectionManager
sも実装する予定はありません。
ジャージーにものを注入するためにどの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-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
を追加した場合にのみ、エラーなく実行されます。
私の知る限りでは、依存関係が2.26-b03と2.26-b04の間で変更された(HK2はコンパイルからtestCompileに移動されました)...まだ完成していない(またはそれにつながる)ジャージ依存関係に何らかの変更があるかもしれません。バグ).
しかし、今のところ単純な解決策は古いバージョンに固執することです:-)