Jersey dejó de funcionar con InjectionManagerFactory no encontrado

161

Recibo el siguiente error al ejecutar mi API de Jersey en Tomcat 8.5.11, lo que hace que mi API se detenga:

HTTP Status 500 - Servlet.init () para servlet Jersey REST Service lanzó una excepción

tipo Informe de excepción

mensaje Servlet.init () para servlet Jersey REST Service lanzó excepción

descripción El servidor encontró un error interno que le impidió cumplir con esta solicitud.

excepción

javax.servlet.ServletException: Servlet.init () para el servlet Jersey REST Service lanzó una excepción org.apache.catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.java:474) org.apache.catalina.valves.ErrorReportValve.inport.Valve. java: 79) org.apache.catalina.valves.AbstractAccessLogValve.invoke (AbstractAccessLogValve.java:624) org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:349) org.apache.coyote.http. http 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.ejecutar (SocketProcessorBase.java:49) java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142) java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:617) org.apache.tom. threads.TaskThread $ WrappingRunnable.run (TaskThread.java:61) java.lang.Thread.run (Thread.java:745)

causa principal

java.lang.IllegalStateException: InjectionManagerFactory no encontrado. 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.japa:47.). Org. ErrorReportValve.invoke (ErrorReportValve.java:79) org.apache.catalina.valves.

La aplicación está construida con las siguientes dependencias con 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.+"
    ) }

Esta descarga jersey-common-2.26-b04.jarque contiene la clase que falta en /org/glassfish/jersey/internal/inject/InjectionManagerFactory. El archivo jar se implementa en la carpeta Tomcat enWEB-INF/lib

¿Qué puede estar mal aquí? El script de gradle funcionó los últimos meses con la misma versión de Tomcat.

Gregor
fuente
1
veo que hubo una nueva versión de jersey el 19/05 - verifique si este es el problema, actualmente tengo el mismo problema
Roman Kesler
search.maven.org/…
Roman Kesler
Este tutorial me ayudó a solucionar este problema crunchify.com/…
JesseBoyd

Respuestas:

316

Agregue esta dependencia:

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

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

Asegúrese de no mezclar sus versiones de dependencia de Jersey. Esta respuesta dice la versión "2.28", pero use cualquier versión que sean sus otras versiones de dependencia de Jersey.

cthiebaud
fuente
2
Me funcionó con la versión de lanzamiento 2.26. No quería usar versiones beta en el código de producción.
saganas
2
Gracias, esta es la respuesta correcta. Funciona con 2.26
mario
1
Ver también para explicación.
Paul Samsotha
2
Esto fue todo para mí - versión 2.28.
Herreros
Lo que fue extraño para mí fue que estaba funcionando, y luego dejó de funcionar HASTA que hice la inclusión anterior según esta publicación. De todos modos, gracias. Mi versión principal era 2.30 y mi versión de inyección como la anterior, es decir, 2.28.
Beezer
127

Jersey 2.26 y posteriores no son compatibles con versiones anteriores. La razón detrás de eso se ha indicado en las notas de la versión :

Desafortunadamente, hubo una necesidad de hacer cambios hacia atrás incompatibles en 2.26. Concretamente, la API de cliente reactiva patentada por Jersey ha desaparecido por completo y ya no se puede admitir; entra en conflicto con lo que se introdujo en JAX-RS 2.1 (ese es el precio de Jersey como "patio de juegos de especificaciones ...").

Otro cambio más importante en el código de Jersey es el intento de hacer que el núcleo de Jersey sea independiente de cualquier marco de inyección específico. Como puede que ahora, Jersey 2.x es (¡era!) Bastante dependiente de HK2, lo que a veces causa problemas (especialmente cuando se ejecuta en otros recipientes de inyección. Jersey ahora define su propia fachada de inyección , que, cuando se implementa correctamente, reemplaza todos inyección interna de Jersey.


Por ahora, uno debería usar las siguientes dependencias:

Maven

<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'
wypieprz
fuente
Ver también el problema No se puede actualizar de 2.25.1 a 2.26
Grigory Kislin
11
Suspiro ... ¿por qué Jersey no subiría la versión a 3.0 si están haciendo un cambio
radical?
1
@trevorism Tengo la sensación de que quieren mantener la versión principal sincronizada con la versión principal JAX-RS. Eso es lo único que tiene sentido para mí.
Paul Samsotha
Además, jersey-common no es un requisito (para agregar manualmente ). Esto ya debería ser utilizado por jersey-server, que debería ser utilizado por jersey-container-servlet-core o cualquier otra dependencia de jersey "principal" que utilice. La única dependencia requerida para deshacerse del error en cuestión es el jersey-hk2 (o jersey-cdi2-se, como se menciona aquí ).
Paul Samsotha
@LuisF, sería correcto si no incluyera la dependencia innecesaria de jersey común. Esto ya es una dependencia transitiva.
Paul Samsotha
47

Aquí está la razón. A partir de Jersey 2.26, Jersey eliminó HK2 como una dependencia difícil . Creó un SPI como fachada para el proveedor de inyección de dependencia, en forma de InjectionManagery InjectionManagerFactory. Entonces, para que Jersey se ejecute, necesitamos tener una implementación de InjectionManagerFactory. Hay dos implementaciones de esto, que son para HK2 y CDI . La dependencia de HK2 es de lo que jersey-hk2otros están hablando.

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

La dependencia de CDI es

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

Este (jersey-cdi2-se) solo debe usarse para entornos SE y no entornos EE.

Jersey realizó este cambio para permitir que otros proporcionen su propio marco de inyección de dependencia. No tienen planes de implementar ningún otro InjectionManager, aunque otros han intentado implementar uno para Guice .

Paul Samsotha
fuente
1
Tenga en cuenta que el uso de CDI (jersey-cdi2-se) requiere una configuración bean.xml en META-INF. De lo contrario, se generará la siguiente excepción: java.lang.IllegalStateException: WELD-ENV-000016: Falta el archivo beans.xml en META-INF
Marco Montel
Esta respuesta me ayudó con tantas inconsistencias, +1 para aclarar jersey-cdi2-se solo debería usarse para SE
Daniel Arechiga
11

Elija qué DI inyectará cosas en Jersey:

Primavera 4:

<dependency>
  <groupId>org.glassfish.jersey.ext</groupId>
  <artifactId>jersey-spring4</artifactId>
</dependency>

Primavera 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>
broc.seib
fuente
2
No es así de fácil. No puedes simplemente cambiar HK2 por Spring. La jersey-springintegración todavía utiliza un puente HK2 debajo del capó para que funcione.
Paul Samsotha
2

La única forma en que pude resolverlo fue a través de:

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>

Entonces, solo si agregué jersey-container-servlety jersey-hk2funcionaría sin errores

Johannes Jander
fuente
0

Hasta donde puedo ver, las dependencias han cambiado entre 2.26-b03 y 2.26-b04 (HK2 se movió de compilar a testCompile) ... podría haber algún cambio en las dependencias de Jersey que aún no se ha completado (o que conducen a un insecto).

Sin embargo, ahora la solución simple es apegarse a una versión anterior :-)

Nikolaus Krismer
fuente
-2

Aquí está la nueva dependencia (agosto de 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>
Ricardo Rossini
fuente