Jersey在未找到InjectionManagerFactory时停止工作

我在Tomcat 8.5.11中运行我的Jersey API时收到以下错误,这导致我的API停止:

HTTP状态500 - servlet .init()为servlet Jersey REST服务抛出 除了< / p >

异常报告

消息servlet .init()为servlet Jersey REST服务抛出异常

description服务器遇到内部错误,无法执行此操作

异常

< p > javax.servlet。ServletException: servlet .init()用于servlet Jersey REST 服务抛出异常 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) < / p >

根本原因

< p > . 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) < / p >

该应用程序与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版本上运行。

150023 次浏览

据我所知,2.26-b03和2.26-b04之间的依赖关系已经发生了变化(HK2从compile移动到testCompile)…球衣依赖项中可能有一些尚未完成的更改(或导致错误)。

然而,现在简单的解决方案是坚持使用旧版本:-)

添加这个依赖:

<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依赖版本的任何版本。

选择哪个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>

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

Jersey 2.26及更新版本与旧版本不向后兼容。背后的原因已经在发布说明中说明:

不幸的是,需要进行向后不兼容的更改 在2.26。具体来说,球衣专有的响应式客户端API是 完全消失,不能再支持-它与 JAX-RS 2.1中引入了什么(Jersey的价格是多少 “规范游乐场. .“). < / p > 泽西岛代码中另一个更大的变化是试图使泽西岛成为核心 独立于任何特定的注入框架。现在你可能知道了, 泽西2。x非常依赖于HK2,有时 导致问题(特别是在其他注入容器上运行时)。< >强球衣 现在定义了它自己的注入facade,当实现时


现在应该使用以下依赖项:

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'

我能解决这个问题的唯一方法是:

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时,它才能正常运行

原因如下。从Jersey 2.26开始,Jersey删除了HK2作为< >强困难< / >强依赖项。它以InjectionManagerInjectionManagerFactory的形式为依赖注入提供程序创建了一个SPI作为facade。因此,为了让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进行了此更改,以允许其他人提供自己的依赖注入框架。他们没有任何实现任何其他__abc0的计划,尽管其他人已经实现了尝试为Guice实现一个