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.


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


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.


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


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'


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 .


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>

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


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


-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>
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.