Jersey, InjectionManagerFactory ile çalışmayı durdurdu


162

Tomcat 8.5.11 Jersey API benim API durdurma neden çalışırken çalıştırırken aşağıdaki hata alıyorum:

HTTP Durumu 500 - Servlet Jersey REST Hizmeti için Servlet.init () istisnası attı

istisna raporu yazın

Forma Servlet.init () for servlet Jersey REST Service istisna attı

açıklama Sunucu, bu isteği yerine getirmesini engelleyen bir iç hatayla karşılaştı.

istisna

javax.servlet.ServletException: Servlet Jersey REST Service için Servlet.init (), org.apache.catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.java:474) org.apache.catalina.valves.ErrorReportValve.volve.volve.volve.volve.volve.volve.volve.volve.info java: 79) org.apache.catalina.valves.AbstractAccessLogValve.invoke (AbstractAccessLogValve.java:624) org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:349) org.apache.coyote.pt. hizmeti (Http11Processor.java:783) org.apache.coyote.AbstractProcessorLight.process (AbstractProcessorLight.java:66) org.apache.coyote.AbstractProtocol $ ConnectionHandler.process (AbstractProcessorLight.java:66) org.apache.coyote.AbstractProtocol $ ConnectionHandler.process (AbstractProtocol.java:798) org.apache.tomcatutil. net.NioEndpoint $ SocketProcessor.doRun (NioEndpoint.java:1434) org.apache.tomcat.util.net.SocketProcessorBase.(SocketProcessorBase.java:49) java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142) java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:617) org.ache.tom.ache.tom.at threads.TaskThread $ WrappingRunnable.run (TaskThread.java:61) java.lang.Thread.run (Thread.java:745)

ana neden

java.lang.IllegalStateException: InjectionManagerFactory bulunamadı. org.glassfish.jersey.internal.inject. (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) veya. ErrorReportValve.invoke (ErrorReportValve.java:79) org.apache.catalina.valves.

Uygulama, gradle ile aşağıdaki bağımlılıklar ile oluşturulur:

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.+"
    ) }

Bu jersey-common-2.26-b04.jar, altında eksik sınıfı içeren indirmeler /org/glassfish/jersey/internal/inject/InjectionManagerFactory. Jar dosyası, Tomcat klasörüneWEB-INF/lib

Burada ne yanlış olabilir? Gradle script son birkaç ay aynı Tomcat versiyonuyla çalıştı.


1
19/05 tarihinde formanın yeni bir versiyonu olduğunu görüyorum - bu sorunun olup olmadığını kontrol edin, şu anda aynı problemim var
Roman Kesler


Bu eğitici, bu sorunu düzeltmeme yardımcı oldu crunchify.com/…
JesseBoyd

Yanıtlar:


317

Bu bağımlılığı ekleyin:

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

bakınız https://stackoverflow.com/a/44536542/1070215

Jersey bağımlılık sürümlerinizi karıştırmamaya dikkat edin. Bu cevap sürüm "2.28" diyor, ancak diğer Jersey bağımlılık sürümleri olan herhangi bir sürümünü kullanın.


2
2.26 sürümüyle benim için çalıştı. Beta sürümlerini üretim kodunda kullanmak istemiyordu.
saganas

2
Teşekkürler, bu doğru cevap. 2.26 ile çalışır
mario

1
Açıklama için ayrıca bakınız .
Paul Samsotha

2
Benim için buydu - sürüm 2.28.
Absmiths

Benim için garip olan şey, çalışıyordu ve daha sonra bu yazıya göre yukarıdaki içermeyi yapana kadar çalışmayı bıraktı. Her neyse, teşekkür ederim. Çekirdek versiyonum 2.30 ve enjekte versiyonum yukarıdaki gibi yani 2.28 idi.
Beezer

127

Jersey 2.26 ve daha yeni sürümler eski sürümlerle geriye dönük uyumlu değildir. Bunun arkasındaki neden sürüm notlarında belirtilmiştir :

Ne yazık ki, 2.26'da geriye dönük olarak uyumsuz değişiklikler yapma ihtiyacı vardı. Somut olarak jarse özel reaktif istemci API'si tamamen kayboldu ve artık desteklenemiyor - JAX-RS 2.1'de tanıtılanlarla çelişiyor (Jersey'nin "spec oyun alanı .." fiyatı budur).

Jersey kodundaki daha büyük bir değişiklik, Jersey çekirdeğini herhangi bir enjeksiyon çerçevesinden bağımsız hale getirmeye çalışmaktır. Şimdi, Jersey 2.x olduğu edebileceğiniz gibi (oldu!) Bazen başkasıyla (sorunlarına neden hK2, oldukça sıkı bağlı. Diğer enjeksiyon kapları çalışırken. Jersey şimdi kendi enjeksiyon cephe tanımlar düzgün bir şekilde uygulandığı,, yerine geçer hepsi iç Jersey enjeksiyonu.


Şimdilik aşağıdaki bağımlılıklar kullanılmalıdır:

Uzman

<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
Ah ... Jersey, bir değişiklik
yaparlarsa

1
@trevorism Ana sürümü JAX-RS ana sürümüyle senkronize tutmak istediklerini hissediyorum. Bana mantıklı gelen tek şey bu.
Paul Samsotha

Ayrıca forma ortak bir gereklilik değildir ( manuel olarak eklemek için). Bu, jersey-container-servlet-core veya kullandığınız herhangi bir "ana" jersey bağımlılığı tarafından çekilmesi gereken jersey-server tarafından çekilmelidir. Söz konusu hatadan kurtulmak için gereken tek bağımlılık jersey-hk2'dir (veya burada belirtildiği gibi jersey-cdi2-se'dir ).
Paul Samsotha

@LuisF, Gereksiz jarse ortak bağımlılığını içermezse doğru olurdu. Bu zaten geçişli bir bağımlılıktır.
Paul Samsotha

47

İşte nedeni. Jersey 2.26'dan itibaren Jersey, HK2'yi zor bir bağımlılık olarak kaldırdı . Bu formunda, bağımlılık enjeksiyon sağlayıcı için bir cephenin olarak bir SSA yarattı InjectionManagerve InjectionManagerFactory. Bu yüzden Jersey'nin çalışması için bir uygulamamızın olması gerekiyor InjectionManagerFactory. Bunun HK2 ve CDI için iki uygulaması vardır . HK2 bağımlılığı jersey-hk2diğerlerinden bahsediyor.

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

CDI bağımlılığı

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

Bu (jersey-cdi2-se) EE ortamları için değil, yalnızca SE ortamları için kullanılmalıdır.

Jersey bu değişikliği başkalarının kendi bağımlılık enjeksiyon çerçevelerini sağlamalarına izin vermek için yaptı. InjectionManagerBaşkaları için herhangi bir plan yapma planları yoktur , ancak diğerleri Guice için bir tane uygulama girişiminde bulunmuştur .


1
CDI (jersey-cdi2-se) kullanmanın META-INF'de bir bean.xml yapılandırması gerektirdiğini unutmayın. Aksi takdirde, aşağıdaki istisna atılır: java.lang.IllegalStateException: WELD-ENV-000016: META-INF'de eksik beans.xml dosyası
Marco Montel

Bu cevap beni pek çok tutarsızlıkla destekledi, jersey-cdi2-se'yi netleştirmek için +1 yalnızca SE için kullanılmalıdır
Daniel Arechiga

11

Jersey'ye malzeme enjekte etmek için hangi DI'yi seçin:

İlkbahar 4:

<dependency>
  <groupId>org.glassfish.jersey.ext</groupId>
  <artifactId>jersey-spring4</artifactId>
</dependency>

İlkbahar 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
O kadar kolay değil. İlkbahar için HK2'yi kapatamazsınız. jersey-springEntegrasyon hala çalışması için kaputun altında bir hK2 köprü kullanır.
Paul Samsotha

2

Bunu çözmenin tek yolu şuydu:

org.glassfish.jersey.core jersey-server $ {jersey-2 sürümü}

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

Yani, sadece eklediysem jersey-container-servletve jersey-hk2hatasız çalışırsa


0

Bağımlılıkları görebildiğim kadarıyla 2.26-b03 ve 2.26-b04 arasında değişti (HK2 derlemeden testCompile'a taşındı) ... jarse bağımlılıklarında henüz tamamlanmamış bazı değişiklikler olabilir (veya bir böcek).

Ancak, şu anda basit çözüm eski bir sürüme sadık kalmak :-)


-2

İşte yeni bağımlılık (Ağustos 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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.