泽西岛停止使用未找到的InjectionManagerFactory

gre*_*gor 136 java tomcat gradle jersey-2.0

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

HTTP状态500 - Servlet的Servlet.init()Jersey REST服务引发异常

类型异常报告

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

description服务器遇到内部错误,导致无法完成此请求.

例外

javax.servlet.ServletException:servlet的Servlet.init()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.apa che.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.+"
    ) }
Run Code Online (Sandbox Code Playgroud)

这下载jersey-common-2.26-b04.jar包含缺少的类/org/glassfish/jersey/internal/inject/InjectionManagerFactory.jar文件部署到Tomcat文件夹下WEB-INF/lib

这可能有什么不对?gradle脚本在过去几个月中使用相同的Tomcat版本.

cth*_*aud 269

添加此依赖项:

<dependency>
    <groupId>org.glassfish.jersey.inject</groupId>
    <artifactId>jersey-hk2</artifactId>
    <version>2.28</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

比照 /sf/answers/3117557971/

  • 版本2.27(匹配jersey-client)为我工作. (3认同)
  • 为我工作的是2.26版本。不想在生产代码中使用Beta版本。 (2认同)
  • 谢谢,这是正确的答案。适用于2.26 (2认同)
  • [另见](/sf/answers/3585227131/) 的解释。 (2认同)
  • 对我来说就是这个-版本2.28。 (2认同)

wyp*_*prz 116

Jersey 2.26和更新版本不能与旧版本向后兼容.其背后的原因已在发行说明中说明:

不幸的是,需要在2.26中进行向后不兼容的更改.具体而言,泽西专有的被动客户端API已经完全消失,不再受支持 - 它与JAX-RS 2.1中引入的内容相冲突(泽西岛的价格是"spec playground ..").

Jersey代码中另一个更大的变化是试图使Jersey核心独立于任何特定的注入框架.正如你可能现在,泽西2.X是(是!)相当紧密依赖于HK2,这有时会导致问题(特别是在其他注射容器中运行时,新泽西州现在定义它自己的注射门面,其中,适当地实施时,替换所有内部泽西注射.


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

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>
Run Code Online (Sandbox Code Playgroud)

摇篮

compile 'org.glassfish.jersey.core:jersey-common:2.26'
compile 'org.glassfish.jersey.inject:jersey-hk2:2.26'
Run Code Online (Sandbox Code Playgroud)

  • 叹了闻......如果他们正在进行突破性的改变,为什么不会将这个版本的版本提升到3.0. (8认同)

Pau*_*tha 40

这就是原因.从泽西岛2.26开始,泽西取消了HK2作为一个依赖.它创建了一个SPI作为依赖注入提供者的门面,在的形式InjectionManagerInjectionManagerFactory.所以对于Jersey来说,我们需要有一个实现InjectionManagerFactory.这有两个实现,分别用于HK2和CDI.jersey-hk2其他人正在谈论HK2的依赖性.

<dependency>
    <groupId>org.glassfish.jersey.inject</groupId>
    <artifactId>jersey-hk2</artifactId>
    <version>2.26</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

CDI依赖是

<dependency>
    <groupId>org.glassfish.jersey.inject</groupId>
    <artifactId>jersey-cdi2-se</artifactId>
    <version>2.26</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

此(jersey-cdi2-se)应仅用于SE环境而非EE环境.

Jersey做了这个改变,允许其他人提供他们自己的依赖注入框架.他们没有任何计划实施任何其他InjectionManager的,尽管其他人已经尝试为Guice实施一个.


bro*_*eib 10

选择将哪些DI注入泽西岛:

春天4:

<dependency>
  <groupId>org.glassfish.jersey.ext</groupId>
  <artifactId>jersey-spring4</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)

春天3:

<dependency>
  <groupId>org.glassfish.jersey.ext</groupId>
  <artifactId>jersey-spring3</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)

HK2:

<dependency>
    <groupId>org.glassfish.jersey.inject</groupId>
    <artifactId>jersey-hk2</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)

  • 它不是那么容易。您不能只将HK2换成Spring。“球衣-弹簧”集成仍然在引擎盖下使用HK2桥来使其正常工作。 (2认同)

小智 0

据我所知,2.26-b03 和 2.26-b04 之间的依赖关系已发生变化(HK2 已从编译移至 testCompile)...球衣依赖关系可能存在一些尚未完成的变化(或者导致一个错误)。

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