Jersey parou de funcionar com o InjectionManagerFactory não encontrado

161

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.jarque 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.

Gregor
fonte
1
i ver que havia uma nova versão de Jersey em 19/05 - verificar se este é o problema, eu tenho o mesmo problema atualmente
Roman Kesler
search.maven.org/…
Roman Kesler
Este tutorial me ajudou a corrigir esse problema crunchify.com/…
JesseBoyd

Respostas:

316

Adicione esta dependência:

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

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.

cthiebaud
fonte
2
Trabalhou para mim com a versão 2.26. Não queria usar versões beta no código de produção.
saganas
2
Obrigado, esta é a resposta correta. Funciona com 2,26
mario
1
Veja também para explicação.
Paul Samsotha 17/07/2018
2
Era isso para mim - versão 2.28.
absmiths
O que foi bizzare para mim foi que ele estava funcionando e parou de funcionar até que eu fiz a inclusão acima, de acordo com este post. De qualquer forma, obrigado. Minha versão principal era 2.30 e minha versão injetada como acima, ou seja, 2.28.
Beezer
127

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 :

Infelizmente, havia uma necessidade de fazer alterações incompatíveis com a versão 2.26. A API do cliente reativo concretamente proprietária de Jersey desapareceu completamente e não pode mais ser suportada - entra em conflito com o que foi introduzido no JAX-RS 2.1 (esse é o preço para Jersey ser "parque de diversões ..").

Outra mudança maior no código de Jersey é a tentativa de tornar o núcleo de Jersey independente de qualquer estrutura de injeção específica. Como você pode agora, o Jersey 2.x é (era!) Bastante dependente do HK2, o que às vezes causa problemas (principalmente quando executado em outros recipientes de injeção. O Jersey agora define sua própria fachada de injeção , que, quando implementada corretamente, substitui todos os injeção interna de Jersey.


Por enquanto, deve-se usar as seguintes dependências:

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
fonte
Veja também o problema Não é possível atualizar de 2.25.1 para 2.26
Grigory Kislin
11
Suspiro ... por que não iria Jersey bater a versão de 3.0 se eles estão fazendo uma alteração de quebra ..
trevorism
1
@trevorism Tenho a sensação de que eles querem manter a versão principal sincronizada com a versão principal do JAX-RS. Essa é a única coisa que faz sentido para mim.
Paul Samsotha
Também jersey-common não é um requisito (para adicionar manualmente ). Isso já deve ser puxado pelo jersey-server, que deve ser puxado pelo jersey-container-servlet-core ou por qualquer outra dependência "principal" do jersey que você usar. A única dependência necessária para se livrar do erro em questão é o jersey-hk2 (ou jersey-cdi2-se, conforme mencionado aqui ).
Paul Samsotha 11/1118
@LuisF, seria correto se não incluísse a dependência desnecessária comum de camisa. Isso já é uma dependência transitiva.
Paul Samsotha 28/02/19
47

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 InjectionManagere InjectionManagerFactory. Portanto, para que o Jersey seja executado, precisamos ter uma implementação do InjectionManagerFactory. Existem duas implementações disso, que são para HK2 e CDI . A dependência do HK2 é sobre a qual os jersey-hk2outros estão falando.

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

A dependência do CDI é

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

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 InjectionManagers, embora outros tenham tentado implementar um para o Guice .

Paul Samsotha
fonte
1
Observe que o uso do CDI (jersey-cdi2-se) requer uma configuração bean.xml no META-INF. Caso contrário seguinte exceção será lançada: java.lang.IllegalStateException: WELD-ENV-000016: Faltando arquivo beans.xml no META-INF
Marco Montel
Esta resposta me ajudou com tantas inconsistências, +1 para esclarecer jersey-cdi2-se deve ser usado apenas para SE
Daniel Arechiga
11

Escolha qual DI injetar coisas em 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
fonte
2
Não é tão fácil. Você não pode simplesmente trocar o HK2 pelo Spring. A jersey-springintegração ainda usa uma ponte HK2 sob o capô para fazê-lo funcionar.
Paul Samsotha 17/07/2018
2

A única maneira de resolver isso era atravé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>

Então, apenas se eu adicionasse jersey-container-servlete jersey-hk2funcionasse sem erros

Johannes Jander
fonte
0

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

Nikolaus Krismer
fonte
-2

Aqui está a nova dependência (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
fonte