JerseyがInjectionManagerFactoryの動作を停止しましたが見つかりません


161

Tomcat 8.5.11でJersey APIを実行しているときに以下のエラーが発生し、APIが停止します。

HTTPステータス500-サーブレットJersey RESTサービスのServlet.init()が例外をスローしました

タイプ例外レポート

サーブレットJersey RESTサービスのメッセージServlet.init()が例外をスローしました

説明サーバーで内部エラーが発生したため、サーバーはこの要求を実行できませんでした。

例外

javax.servlet.ServletException:サーブレットJersey RESTサービスのServlet.init()が例外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.java:617)org.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.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)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。

アプリケーションは、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
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

Jersey依存バージョンを混在させないようにしてください。この回答はバージョン「2.28」を示していますが、他のJersey依存バージョンと同じバージョンを使用してください。


2
2.26リリースバージョンで私のために働いた。プロダクションコードでベータ版を使用したくありませんでした。
saganas 2017年

2
ありがとう、これが正解です。2.26で動作
mario


2
これは私にとってはそれでした-バージョン2.28。
absmiths

私にとって奇妙なことは、それが機能していて、この投稿に従って上記のインクルージョンを実行するまで機能しなくなったことです。とにかくありがとうございます。私のコアバージョンは2.30で、上記のように私のインジェクトバージョンは2.28です。
Beezer

127

Jersey 2.26以降は、古いバージョンとの下位互換性がありません。その背後にある理由は、リリースノートに記載されています

残念ながら、2.26では後方互換性のない変更を行う必要がありました。具体的には、ジャージー独自のリアクティブクライアントAPIは完全になくなっており、サポートできなくなりました。これは、JAX-RS 2.1で導入されたものと矛盾します(ジャージーの価格は「スペックプレイグラウンド..」です)。

ジャージーコードのもう1つの大きな変更は、ジャージーコアを特定のインジェクションフレームワークから独立させる試みです。現在お気づきかもしれませんが、Jersey 2.xは(以前!)HK2にかなり依存しているため、問題が発生することがあります(特に、他の注入コンテナで実行する場合、Jerseyは独自の注入ファサードを定義し、適切に実装するとすべてを置き換えます)内部ジャージー注射。


今のところ、次の依存関係を使用する必要があります:

メイベン

<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
彼らは互換性に影響する変更を行っている場合はため息をつく...なぜジャージーは... 3.0へのバージョンをぶつけたりしないだろう
trevorism

1
@trevorismメジャーバージョンをJAX-RSメジャーバージョンと同期させておきたいと思っています。それが私にとって意味のある唯一のものです。
ポールサムソタ

また、jersey-commonは必須ではありません(手動で追加するため)。これは、jersey-container-servlet-coreまたは使用するその他の「メイン」ジャージ依存関係によってプルされるはずのjersey-serverによってすでにプルされているはずです。問題のエラーを取り除くために必要な唯一の依存関係は、jersey-hk2(またはここで言及されている jersey-cdi2-se )です。
ポールサムソタ2018

@LuisF、不要​​なjersey-common依存関係が含まれていなければそれは正しいでしょう。これはすでに推移的な依存関係です。
ポールサムソタ

47

これが理由です。Jersey 2.26以降、JerseyはHK2をハード依存関係から削除しました。依存関係注入プロバイダーのファサードとして、InjectionManagerおよびの形式でSPIを作成しました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環境では使用しないでください。

ジャージーはこの変更を行って、他のユーザーが独自の依存性注入フレームワークを提供できるようにしました。彼らは他InjectionManagerのを実装する計画はありませんが、他の人はGuiceの実装を試みました


1
CDI(jersey-cdi2-se)を使用するには、META-INFにbean.xml構成が必要であることに注意してください。そうしないと、次の例外がスローされます。java.lang.IllegalStateException:WELD-ENV-000016:META-INFにbeans.xmlファイルがありません
マルコモンテル

この回答は非常に多くの不一致を助けました。jersey-cdi2-seを明確にするための+1はSEにのみ使用する必要があります
Daniel Arechiga

11

ジャージーに原料を注入する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>

2
それは簡単ではありません。SpringのHK2を切り替えるだけではできません。jersey-spring統合はまだそれを動作させるためにフードの下HK2ブリッジを使用しています。
ポールサムソタ2018

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に移動されました)...まだ完了していない(またはバグ)。

しかし、今のところ簡単な解決策は、古いバージョンに固執することです:-)


-2

ここに新しい依存関係があります(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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.