tutorial org java tomcat gradle jersey-2.0

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 :-)