Estou recebendo o erro abaixo ao executar minha API de Jersey no Tomcat 8.5.11, o que está causando a parada da minha API:
HTTP Status 500 - Servlet.init () para o servlet Jersey REST Service lançou exceção
tipo Relatório de exceção
A mensagem Servlet.init () para o servlet Jersey REST Service lançou exceção
descrição O servidor encontrou um erro interno que o impediu de atender a essa solicitação.
exceção
javax.servlet.ServletException: Servlet.init () para o servlet Jersey REST Service lançou a exceção 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.coyor.http11.Http11.Help. serviço (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.execute (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)
causa raiz
java.lang.IllegalStateException: InjectionManagerFactory não 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.Authenticator.AuthenticatorBase.invoke (AuthenticatorBase.java:474) org.apache.catalina.valves. ErrorReportValve.invoke (ErrorReportValve.java:79) org.apache.catalina.valves.
O aplicativo é construído com as seguintes dependências com 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.+"
) }
Isso baixa o jersey-common-2.26-b04.jar
que contém a classe ausente em /org/glassfish/jersey/internal/inject/InjectionManagerFactory
. O arquivo jar é implantado na pasta Tomcat emWEB-INF/lib
O que pode estar errado aqui? O script gradle trabalhou nos últimos meses com a mesma versão do Tomcat.
fonte
Respostas:
Adicione esta dependência:
cf. https://stackoverflow.com/a/44536542/1070215
Certifique-se de não misturar suas versões de dependência de Jersey. Esta resposta diz a versão "2.28", mas use qualquer versão que sejam suas outras versões de dependência de Jersey.
fonte
Jersey 2.26 e mais recentes não são compatíveis com versões anteriores. A razão por trás disso foi declarada nas notas de versão :
Por enquanto, deve-se usar as seguintes dependências:
Maven
Gradle
fonte
Aqui está o motivo. A partir de Jersey 2.26, Jersey removeu o HK2 como uma dependência difícil . Ele criou um SPI como uma fachada para o provedor de injeção de dependência, na forma de
InjectionManager
eInjectionManagerFactory
. Portanto, para que o Jersey seja executado, precisamos ter uma implementação doInjectionManagerFactory
. Existem duas implementações disso, que são para HK2 e CDI . A dependência do HK2 é sobre a qual osjersey-hk2
outros estão falando.A dependência do CDI é
Este (jersey-cdi2-se) deve ser usado apenas para ambientes SE e não ambientes EE.
Jersey fez essa alteração para permitir que outras pessoas forneçam sua própria estrutura de injeção de dependência. Eles não têm planos de implementar nenhum outro
InjectionManager
s, embora outros tenham tentado implementar um para o Guice .fonte
Escolha qual DI injetar coisas em Jersey:
Primavera 4:
Primavera 3:
HK2:
fonte
jersey-spring
integração ainda usa uma ponte HK2 sob o capô para fazê-lo funcionar.A única maneira de resolver isso era através de:
org.glassfish.jersey.core jersey-server $ {jersey-2-version}
Então, apenas se eu adicionasse
jersey-container-servlet
ejersey-hk2
funcionasse sem errosfonte
Tanto quanto posso ver, as dependências mudaram entre 2.26-b03 e 2.26-b04 (o HK2 foi movido de compile para testCompile) ... pode haver alguma alteração nas dependências de jersey que ainda não foram concluídas (ou que levam a um inseto).
No entanto, agora a solução mais simples é manter uma versão mais antiga :-)
fonte
Aqui está a nova dependência (agosto de 2017)
fonte