Jersey stopped working with InjectionManagerFactory not found

JavaTomcatGradleJersey 2.0

Java Problem Overview


I am receiving below error while running my Jersey API in Tomcat 8.5.11 which is causing my API to stop:

> HTTP Status 500 - Servlet.init() for servlet Jersey REST Service threw > exception > > type Exception report > > message Servlet.init() for servlet Jersey REST Service threw exception > > description The server encountered an internal error that prevented it > from fulfilling this request. > > exception > > 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) > > root cause > > java.lang.IllegalStateException: InjectionManagerFactory not found. > 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)

The application is build with the following dependencies with 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.+"
    ) }

This downloads jersey-common-2.26-b04.jar which contains the missing class under /org/glassfish/jersey/internal/inject/InjectionManagerFactory. The jar file is deployed into the Tomcat folder under WEB-INF/lib

What can be wrong here? The gradle script worked the last few month with the same Tomcat version.

Java Solutions


Solution 1 - Java

Add this dependency:

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

cf. https://stackoverflow.com/a/44536542/1070215

Make sure not to mix your Jersey dependency versions. This answer says version "2.28", but use whatever version your other Jersey dependency versions are.

Solution 2 - Java

Jersey 2.26 and newer are not backward compatible with older versions. The reason behind that has been stated in the release notes:

> Unfortunately, there was a need to make backwards incompatible changes > in 2.26. Concretely jersey-proprietary reactive client API is > completely gone and cannot be supported any longer - it conflicts with > what was introduced in JAX-RS 2.1 (that's the price for Jersey being > "spec playground.."). > > Another bigger change in Jersey code is attempt to make Jersey core > independent of any specific injection framework. As you might now, > Jersey 2.x is (was!) pretty tightly dependent on HK2, which sometimes > causes issues (esp. when running on other injection containers. Jersey > now defines it's own injection facade, which, when implemented > properly, replaces all internal Jersey injection.


As for now one should use the following dependencies:

Maven

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

Gradle

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

Solution 3 - Java

Here is the reason. Starting from Jersey 2.26, Jersey removed HK2 as a hard dependency. It created an SPI as a facade for the dependency injection provider, in the form of the InjectionManager and InjectionManagerFactory. So for Jersey to run, we need to have an implementation of the InjectionManagerFactory. There are two implementations of this, which are for HK2 and CDI. The HK2 dependency is the jersey-hk2 others are talking about.

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

The CDI dependency is

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

This (jersey-cdi2-se) should only be used for SE environments and not EE environments.

Jersey made this change to allow others to provide their own dependency injection framework. They don't have any plans to implement any other InjectionManagers, though others have made attempts at implementing one for Guice.

Solution 4 - Java

Choose which DI to inject stuff into 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>

Solution 5 - Java

The only way I could solve it was via:

org.glassfish.jersey.core jersey-server ${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>

So, only if I added jersey-container-servlet and jersey-hk2 would it run without errors

Solution 6 - Java

As far as I can see dependencies have changed between 2.26-b03 and 2.26-b04 (HK2 was moved to from compile to testCompile)... there might be some change in the jersey dependencies that has not been completed yet (or which lead to a bug).

However, right now the simple solution is to stick to an older version :-)

Solution 7 - Java

Here is the new dependency (August 2017)

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiongregorView Question on Stackoverflow
Solution 1 - JavacthiebaudView Answer on Stackoverflow
Solution 2 - JavawypieprzView Answer on Stackoverflow
Solution 3 - JavaPaul SamsothaView Answer on Stackoverflow
Solution 4 - Javabroc.seibView Answer on Stackoverflow
Solution 5 - JavaJohannes JanderView Answer on Stackoverflow
Solution 6 - JavaNikolaus KrismerView Answer on Stackoverflow
Solution 7 - JavaRicardo RossiniView Answer on Stackoverflow