Jersey ha smesso di funzionare con InjectionManagerFactory non trovato


161

Ricevo l'errore di seguito durante l'esecuzione dell'API Jersey in Tomcat 8.5.11 che causa l'arresto dell'API:

HTTP Status 500 - Servlet.init () per il servizio REST Jersey servlet ha generato un'eccezione

digitare Rapporto eccezioni

messaggio Servlet.init () per il servizio REST Jersey servlet ha generato un'eccezione

descrizione Il server ha riscontrato un errore interno che gli ha impedito di soddisfare questa richiesta.

eccezione

javax.servlet.ServletException: Servlet.init () per il servizio REST Jersey servlet ha generato un'eccezione org.apache.catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.java:474) org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportVve java: 79) org.apache.catalina.valves.AbstractAccessLogValve.invoke (AbstractAccessLogValve.java:624) org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:349) org.apache.coyote.http11. 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 (ThreadPoolExecutor.java:617) org.apache.tomcat threads.TaskThread $ WrappingRunnable.run (TaskThread.java:61) java.lang.Thread.run (Thread.java:745)

causa ultima

java.lang.IllegalStateException: InjectionManagerFactory non trovata. 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.java:474) org.apache.catina. ErrorReportValve.invoke (ErrorReportValve.java:79) org.apache.catalina.valves.

L'applicazione viene creata con le seguenti dipendenze 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.+"
    ) }

Questo download jersey-common-2.26-b04.jarche contiene la classe mancante sotto /org/glassfish/jersey/internal/inject/InjectionManagerFactory. Il file jar viene distribuito nella cartella Tomcat inWEB-INF/lib

Cosa può esserci di sbagliato qui? Lo script Gradle ha funzionato negli ultimi mesi con la stessa versione di Tomcat.


1
vedo che c'era una nuova versione della maglia il 19/05 - controlla se questo è il problema, al momento ho lo stesso problema
Roman Kesler


Questo tutorial mi ha aiutato a risolvere questo problema crunchify.com/…
JesseBoyd,

Risposte:


316

Aggiungi questa dipendenza:

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

cf. https://stackoverflow.com/a/44536542/1070215

Assicurati di non mescolare le tue versioni di dipendenza Jersey. Questa risposta dice la versione "2.28", ma usa qualunque versione siano le tue altre versioni di dipendenza Jersey.


2
Ha funzionato per me con la versione 2.26. Non volevo usare le versioni beta nel codice di produzione.
saganas,

2
Grazie, questa è la risposta corretta. Funziona con 2.26
mario

1
Vedi anche per la spiegazione.
Paul Samsotha,

2
Questo è stato per me - versione 2.28.
fabbri il

Ciò che è stato bizzare per me è che stava funzionando, e poi ha smesso di funzionare FINO A quando ho fatto l'inclusione di cui sopra in questo post. Comunque grazie. La mia versione principale era 2.30 e la mia versione di iniezione come sopra cioè 2.28.
Beezer,

127

Jersey 2.26 e successivi non sono compatibili con le versioni precedenti. Il motivo dietro ciò è stato indicato nelle note di rilascio :

Sfortunatamente, era necessario apportare modifiche incompatibili all'indietro in 2.26. L'API client reattiva brevettatamente proprietaria di Jersey è completamente scomparsa e non può più essere supportata: è in conflitto con ciò che è stato introdotto in JAX-RS 2.1 (questo è il prezzo per Jersey che è "parco giochi specifico ...").

Un altro cambiamento più grande nel codice Jersey è il tentativo di rendere il nucleo di Jersey indipendente da qualsiasi quadro di iniezione specifico. Come potresti ora, Jersey 2.x è (era!) Abbastanza strettamente dipendente da HK2, che a volte causa problemi (specialmente quando si esegue su altri contenitori per iniezione. Jersey ora definisce la propria facciata di iniezione , che, se implementata correttamente, sostituisce tutto iniezione interna in jersey.


Per ora si dovrebbero usare le seguenti dipendenze:

Esperto di

<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
Sospiro ... perché Jersey non dovrebbe portare la versione 3.0 se stanno apportando un cambiamento
decisivo

1
@trevorism Ho la sensazione che vogliono mantenere sincronizzata la versione principale con la versione principale JAX-RS. Questa è l'unica cosa che ha senso per me.
Paul Samsotha,

Anche la maglia comune non è un requisito (da aggiungere manualmente ). Questo dovrebbe già essere inserito da Jersey Server, che dovrebbe essere inserito da Jersey-Container-Servlet-Core o da qualsiasi altra "principale" dipendenza da Jersey che usi. L'unica dipendenza necessaria per sbarazzarsi dell'errore in questione è la maglia-hk2 (o maglia-cdi2-se, come menzionato qui ).
Paul Samsotha,

@LuisF, Sarebbe corretto se non includesse la dipendenza inutile comune-jersey. Questa è già una dipendenza transitiva.
Paul Samsotha,

47

Ecco il motivo. A partire da Jersey 2.26, Jersey ha rimosso HK2 come una forte dipendenza. Ha creato una SPI come facciata per il provider di iniezione di dipendenza, sotto forma di InjectionManagere InjectionManagerFactory. Quindi per far funzionare Jersey, dobbiamo implementare il InjectionManagerFactory. Esistono due implementazioni di questo, che sono per HK2 e CDI . La dipendenza HK2 sta jersey-hk2parlando degli altri.

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

La dipendenza da CDI è

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

Questo (jersey-cdi2-se) dovrebbe essere usato solo per ambienti SE e non ambienti EE.

Jersey ha apportato questa modifica per consentire ad altri di fornire il proprio framework di iniezione di dipendenza. Non hanno piani per implementare nessun altro InjectionManager, sebbene altri abbiano tentato di implementarne uno per Guice .


1
Si noti che l'utilizzo di CDI (jersey-cdi2-se) richiede una configurazione bean.xml in META-INF. Altrimenti verrà generata la seguente eccezione: java.lang.IllegalStateException: WELD-ENV-000016: file bean.xml mancante in META-INF
Marco Montel,

Questa risposta mi ha aiutato con tante incoerenze, +1 per chiarire jersey-cdi2-se dovrebbe essere usato solo per SE
Daniel Arechiga,

11

Scegli quale DI iniettare roba in 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
Non è così facile. Non puoi semplicemente cambiare HK2 per Spring. L' jersey-springintegrazione utilizza ancora un ponte HK2 sotto il cofano per farlo funzionare.
Paul Samsotha,

2

L'unico modo per risolverlo è stato tramite:

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>

Quindi, solo se ho aggiunto jersey-container-servlete jersey-hk2funzionerebbe senza errori


0

Per quanto posso vedere le dipendenze sono cambiate tra 2.26-b03 e 2.26-b04 (HK2 è stato spostato dalla compilazione alla testCompile) ... potrebbero esserci dei cambiamenti nelle dipendenze della maglia che non sono ancora stati completati (o che portano a un insetto).

Tuttavia, in questo momento la soluzione semplice è attenersi a una versione precedente :-)


-2

Ecco la nuova dipendenza (agosto 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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.