泽西岛停止与InjectionManagerFactory一起工作


161

在Tomcat 8.5.11中运行Jersey API时,出现以下错误,导致API停止:

HTTP状态500-Servlet Jersey REST Service的Servlet.init()抛出异常

类型例外报告

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

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

例外

javax.servlet.ServletException:用于Servlet Jersey REST Service的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。服务(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。运行(SocketProcessorBase.java:49)java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)org.apache.tomcat.util。 thread.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。

应用程序使用以下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文件被部署到下面的Tomcat文件夹中WEB-INF/lib

这里有什么问题?gradle脚本在最近几个月使用相同的Tomcat版本。


1
我看到19/05上有一个新版的球衣-检查是否是问题,我目前有同样的问题
Roman Kesler


本教程帮助我解决了问题crunchify.com/…–
JesseBoyd

Answers:


316

添加此依赖项:

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


2
为我工作的是2.26版本。不想在生产代码中使用Beta版本。
saganas

2
谢谢,这是正确的答案。使用2.26
mario


2
对我来说就是这个-版本2.28。
absmiths

对我来说,很奇怪的是它正在工作,然后停止工作,直到我按照此职位进行了上述列入。无论如何,谢谢。我的核心版本为2.30,而我的注入版本为2.28。
Beezer

127

Jersey 2.26和更高版本与旧版本不向后兼容。发行说明中已说明了其背后的原因:

不幸的是,有必要在2.26中进行向后不兼容的更改。具体来说,球衣专有的反应式客户端API已完全消失,不再受支持-它与JAX-RS 2.1中引入的内容冲突(这就是Jersey的“规格游乐场”的价格。)。

Jersey代码的另一个更大变化是试图使Jersey核心独立于任何特定的注入框架。就像您现在可能看到的那样,Jersey 2.x非常依赖于HK2,这有时会导致问题(特别是在其他注入容器上运行时。Jersey现在定义了它自己的注入Facade,如果实施正确,它将替换所有内部球衣注射。


到目前为止,应该使用以下依赖项:

马文

<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'


11
感叹...如果他们做出重大更改,为什么Jersey不会将版本提高到3.0
。.– trevorism

1
@trevorism我觉得他们想使主要版本与JAX-RS主要版本保持同步。那是对我来说唯一有意义的事情。
Paul Samsotha

同样,不需要jersey-common(手动添加)。这应该已经由jersey-server引入了,应该由jersey-container-servlet-core或您使用的任何其他“主”球衣依赖项来引入。唯一需要依赖摆脱问题的错误是新泽西州HK2(或运动衫- cdi2-SE,提到这里)。
Paul Samsotha

@LuisF,如果它不包括不必要的球衣通用依赖项,那将是正确的。这已经是传递依赖。
Paul Samsotha

47

这是原因。从Jersey 2.26开始,Jersey删除了HK2作为依赖性。它以InjectionManagerand 的形式创建了一个SPI作为依赖项注入提供者的外观InjectionManagerFactory。因此,要运行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进行了此更改,以允许其他人提供自己的依赖项注入框架。他们没有实现其他任何计划的计划InjectionManager,尽管其他人已经尝试为Guice实现一个计划


1
请注意,使用CDI(jersey-cdi2-se)需要在META-INF中进行bean.xml配置。否则,将引发以下异常:java.lang.IllegalStateException:WELD-ENV-000016:META-INF中的beans.xml文件丢失
Marco Montel,

这个答案帮助我解决了许多不一致的问题,为澄清jersey-cdi2-se +1应该仅用于SE
Daniel Arechiga

11

选择将DI注入到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>

2
那并没那么简单。您不能只将HK2换成Spring。该jersey-spring整合仍然使用引擎盖下HK2桥,使其工作。
Paul Samsotha

2

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

org.glassfish.jersey.core球衣服务器$ {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-servlet并且jersey-hk2它不会错误运行


0

据我所知,依赖关系在2.26-b03和2.26-b04之间发生了变化(HK2已从编译更改为testCompile)...泽西岛依赖关系可能有一些变化尚未完成(或导致一个错误)。

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


-2

这是新的依赖关系(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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.