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.jar
que 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.
fuente
Respuestas:
Agregue esta dependencia:
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.
fuente
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 :
Por ahora, uno debería usar las siguientes dependencias:
Maven
Gradle
fuente
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
InjectionManager
yInjectionManagerFactory
. Entonces, para que Jersey se ejecute, necesitamos tener una implementación deInjectionManagerFactory
. Hay dos implementaciones de esto, que son para HK2 y CDI . La dependencia de HK2 es de lo quejersey-hk2
otros están hablando.La dependencia de CDI es
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 .fuente
Elija qué DI inyectará cosas en Jersey:
Primavera 4:
Primavera 3:
HK2:
fuente
jersey-spring
integración todavía utiliza un puente HK2 debajo del capó para que funcione.La única forma en que pude resolverlo fue a través de:
org.glassfish.jersey.core jersey-server $ {jersey-2-version}
Entonces, solo si agregué
jersey-container-servlet
yjersey-hk2
funcionaría sin erroresfuente
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 :-)
fuente
Aquí está la nueva dependencia (agosto de 2017)
fuente