Jersey无法工作,提示找不到InjectionManagerFactory。

209
我在Tomcat 8.5.11中运行我的Jersey API时遇到以下错误,导致我的API停止:
HTTP状态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.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.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)
该应用程序构建于以下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工作正常。


1
我看到Jersey在19/05有一个新版本 - 检查一下这是否是问题,我目前遇到了同样的问题。 - Roman Kesler
https://search.maven.org/#search|gav|1|g%3A%22org.glassfish.jersey.core%22%20AND%20a%3A%22jersey-common%22 - Roman Kesler
这个教程帮助我解决了这个问题:http://crunchify.com/how-to-build-restful-service-with-java-using-jax-rs-and-jersey/ - JesseBoyd
在此处检查解决方案:https://bigdata-etl.com/jersey-injectionmanagerfactory-not-found/ - Paweł Cieśla
7个回答

396
将此依赖项添加:
<dependency>
    <groupId>org.glassfish.jersey.inject</groupId>
    <artifactId>jersey-hk2</artifactId>
    <version>2.28</version>
</dependency>

请确保不要混淆您的Jersey依赖版本。此答案指的是版本“2.28”,但请使用与其他Jersey依赖版本相同的版本。

cf. https://dev59.com/9KLia4cB1Zd3GeqPfTJj#44536542


2
在2.26版本中对我有效。不想在生产代码中使用beta版本。 - saganas
2
谢谢,这是正确的答案。 适用于2.26版本。 - mario
2
请参考此处的解释。 - Paul Samsotha
2
这就是我所使用的版本2.28。 - absmiths
1
@Beezer 不要混合使用不同版本的Jersey依赖项。如果你的jersey-core(实际上是一个传递依赖)是2.30,那么你的jersey-hk2也应该是2.30。混合使用不同版本的依赖项总会导致奇怪的问题。 - Paul Samsotha
显示剩余3条评论

160
Jersey 2.26及更高版本与旧版本不兼容。这是在发布说明中说明的原因:

不幸的是,在2.26中需要进行向后不兼容的更改。具体来说,Jersey专有的响应式客户端API已经完全删除,不能再继续支持 - 它与JAX-RS 2.1引入的内容冲突(那是Jersey作为“规范游乐场”的代价)。

Jersey代码中的另一个较大变化是试图使Jersey核心独立于任何特定的注入框架。如您所知,Jersey 2.x与HK2有相当紧密的依赖关系,在其他注入容器上运行时有时会引起问题。Jersey现在定义了自己的注入外观,当正确实现时,将替换所有内部Jersey注入。


目前,应使用以下依赖项:

Maven

<dependency>
    <groupId>org.glassfish.jersey.inject</groupId>
    <artifactId>jersey-hk2</artifactId>
    <version>2.26</version>
</dependency>
Gradle
compile 'org.glassfish.jersey.inject:jersey-hk2:2.26'

请参阅问题无法从2.25.1升级到2.26 - Grigory Kislin
25
叹气...如果他们要进行重大更改,为什么新泽西州不将版本升级到3.0呢? - trevorism
1
@trevorism 我有一种感觉,他们想要将主要版本与JAX-RS的主要版本保持同步。这是我唯一能理解的事情。 - Paul Samsotha
此外,jersey-common不是必需的(手动添加)。这应该已经被jersey-server引入,而jersey-container-servlet-core或任何其他您使用的“主”jersey依赖项也应该被引入。为了消除问题中的错误,唯一需要的依赖关系是jersey-hk2(或jersey-cdi2-se,如此处所述)。 - Paul Samsotha

65
这是原因。从Jersey 2.26开始,Jersey将HK2作为强依赖项移除了。它创建了一个SPI作为依赖注入提供程序的外观,以InjectionManagerInjectionManagerFactory的形式。因此,为了运行Jersey,我们需要实现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做出了这个改变,是为了让其他人提供自己的依赖注入框架。他们没有计划实现任何其他的InjectionManager,尽管其他人已经尝试为Guice实现一个


1
请注意,使用CDI(jersey-cdi2-se)需要在META-INF中进行bean.xml配置。否则将抛出以下异常:java.lang.IllegalStateException: WELD-ENV-000016:META-INF中缺少beans.xml文件。 - Marco Montel
这个答案帮助我解决了很多不一致的问题,+1 以澄清 jersey-cdi2-se 只应该用于 SE。 - Daniel Arechiga

13

选择将东西注入Jersey的哪个DI:

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

2
这并不是那么容易的。你不能只是简单地将HK2换成Spring。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-servletjersey-hk2后,才能使其正常运行,否则会出现错误。

0
就我所看到的,2.26-b03和2.26-b04之间的依赖关系似乎已经发生了变化(HK2从编译状态移动到测试编译状态)......可能还存在一些jersey依赖关系的更改尚未完成(或者导致了一个bug)。
然而,现在简单的解决方案就是使用旧版本 :-)

-3

这是新的依赖项(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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接