首页 文章

Jersey 停止使用未找到的InjectionManagerFactory

提问于
浏览
84

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

HTTP状态500 - Servlet的Servlet.init()Jersey REST服务抛出异常类型异常报告消息Servlet.init()用于servlet Jersey REST服务引发异常描述服务器遇到内部错误,导致无法完成此请求 . 异常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:61 7)org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)java.lang.Thread.run(Thread.java:745)root cause 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 回答

  • 154

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

  • 0

    添加此依赖项:

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

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

  • 2

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

    不幸的是,需要在2.26中进行向后不兼容的更改 . 具体而言,泽西专有的被动客户端API已经完全消失,不再受支持 - 它与JAX-RS 2.1中引入的内容相冲突( Jersey 的价格是“spec playground ..”) . Jersey代码中另一个更大的变化是试图使Jersey核心独立于任何特定的注入框架 . 正如你现在所看到的那样,泽西2.x(依旧!)非常依赖HK2,这有时会导致问题(特别是在其他注射容器上运行时 . Jersey 现在定义它自己的注射外观,当正确实施时,取代所有内部泽西注射 .


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

    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>
    

    Gradle

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

    这就是原因 . 从 Jersey 2.26开始,泽西取消了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 .

  • -1

    选择将哪些DI注入 Jersey :

    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>
    
  • 21

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

    org.glassfish.jersey.core jersey-server $

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

  • 86

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

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

  • 8

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

相关问题