Jersey停止使用未找到的InjectionManagerFactory

时间:2017-05-20 16:49:01

标签: java tomcat gradle jersey-2.0

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

  

HTTP状态500 - 用于servlet的Servlet.init()Jersey REST服务投掷   例外

     

输入例外报告

     

消息Servlet.init()用于servlet Jersey REST服务抛出异常

     

description服务器遇到阻止它的内部错误   完成此请求。

     

例外

     

javax.servlet.ServletException:servlet的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.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版本。

8 个答案:

答案 0 :(得分:215)

添加此依赖项:

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

比照https://stackoverflow.com/a/44536542/1070215

答案 1 :(得分:108)

Jersey 2.26及更新版本不与旧版本向后兼容。其背后的原因已在release notes

中说明
  

不幸的是,需要进行向后不兼容的更改   在2.26。具体地说,泽西专有的反应客户端API是   完全消失了,不再支持 - 它与之相冲突   在JAX-RS 2.1中引入了什么(这是泽西岛的价格   “spec playground ..”。)。

     

泽西岛代码的另一个更大变化是尝试制造泽西核心   独立于任何特定的注射框架。就像你现在一样,   泽西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>

<强>摇篮

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

答案 2 :(得分:33)

这是原因。从Jersey 2.26开始,Jersey删除了HK2作为 hard 依赖项。它以InjectionManagerInjectionManagerFactory的形式创建了一个SPI作为依赖项注入提供程序的基础。因此,要运行Jersey,我们需要实现InjectionManagerFactory的实现。有两个实现,分别用于HK2 and 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的计划,尽管其他人已经制定了attempts at implementing one for Guice

答案 3 :(得分:26)

我有同样的问题,在降级到3月份部署的版本(2.26-b03)后,一切都恢复正常,希望有所帮助

答案 4 :(得分:9)

选择将哪些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>

答案 5 :(得分:2)

我能解决的唯一方法是通过:

        org.glassfish.jersey.core         球衣服务器         $ {球衣-2版本}     

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

答案 6 :(得分:0)

据我所知,2.26-b03和2.26-b04之间的依赖关系发生了变化(HK2从编译转移到testCompile)......可能还有一些尚未完成的球衣依赖性变化(或这会导致一个错误。)

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

答案 7 :(得分:-1)

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