java - org - Jersey dejó de funcionar con InjectionManagerFactory no encontrado
jersey-hk2 maven (7)
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
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 servlet Jersey REST Service arrojó 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.run (SocketProcessorBase.java:49) java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor. java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:617) org.apa che.tomcat.util.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.AbstractAccessLogValve.invoke (AbstractAccessLogValve.java:624) org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.ja. 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 (ThreadPool: ThreadPool: ThreadPool ) org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run (TaskThread.java:61) java.lang.Thread.run (Thread.java:745)
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.+"
) }
Esto descarga
jersey-common-2.26-b04.jar
que contiene la clase que falta en
/org/glassfish/jersey/internal/inject/InjectionManagerFactory
.
El archivo jar se implementa en la carpeta Tomcat en
WEB-INF/lib
¿Qué puede estar mal aquí? El script de Gradle funcionó los últimos meses con la misma versión de Tomcat.
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>
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 dependencias, en forma de
InjectionManager
e
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 el
jersey-hk2
otros hablan.
<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 EE.
Jersey realizó este cambio para permitir que otros proporcionen su propio marco de inyección de dependencia.
No tienen ningún plan para implementar ningún otro
InjectionManager
, aunque otros han
intentado implementar uno para Guice
.
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>
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 intentar hacer que el núcleo de Jersey sea independiente de cualquier marco de inyección específico. Como es posible 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.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''
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 agrego
jersey-container-servlet
y
jersey-hk2
funcionaría sin errores
Por lo que 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 :-)