泽西岛停止与注入管理器工厂的工作未找到

2022-08-31 06:15:53

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

HTTP Status 500 - Servlet.init() for servlet Jersey REST Service throw exception

类型异常报告

消息 Servlet.init() for servlet Jersey REST Service 抛出异常

说明 服务器遇到内部错误,导致无法满足此请求。

例外

javax.servlet.ServletException: Servlet.init() for servlet Jersey REST Service threw exception 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.+"
    ) }

这将下载包含 下缺少的类。jar 文件被部署到 Tomcat 文件夹中,下jersey-common-2.26-b04.jar/org/glassfish/jersey/internal/inject/InjectionManagerFactoryWEB-INF/lib

这里可能出了什么问题?在过去的几个月里,gradle脚本使用相同的Tomcat版本。


答案 1

添加此依赖项:

<dependency>
    <groupId>org.glassfish.jersey.inject</groupId>
    <artifactId>jersey-hk2</artifactId>
    <version>2.28</version>
</dependency>

参见 https://stackoverflow.com/a/44536542/1070215

确保不要混合使用你的泽西岛依赖项版本。这个答案说的是版本“2.28”,但请使用其他泽西岛依赖项版本的任何版本。


答案 2

泽西岛 2.26 及更高版本与旧版本不向后兼容。其背后的原因已在发行说明中说明:

不幸的是,有必要在2.26中进行向后不兼容的更改。具体来说,泽西岛专有的响应式客户端API已经完全消失了,不能再受支持了 - 它与JAX-RS 2.1中引入的内容相冲突(这就是泽西岛成为“规范游乐场”的代价。

泽西岛代码中另一个更大的变化是试图使泽西核心独立于任何特定的注入框架。就像你现在可能一样,泽西2.x非常严格地依赖于HK2,这有时会导致问题(特别是在其他注射容器上运行时)。泽西岛现在定义了它自己的注射立面,如果实施得当,它将取代所有内部泽西岛注射。


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

马文

<dependency>
    <groupId>org.glassfish.jersey.inject</groupId>
    <artifactId>jersey-hk2</artifactId>
    <version>2.26</version>
</dependency>

格雷德尔

compile 'org.glassfish.jersey.inject:jersey-hk2:2.26'

推荐