जर्सी इंजेक्शनमैनेजर के साथ काम करना बंद कर दिया


161

मुझे टॉमकैट 8.5.11 में अपने जर्सी एपीआई को चलाते समय त्रुटि प्राप्त हो रही है, जिससे मेरा एपीआई बंद हो रहा है:

HTTP स्थिति 500 ​​- सर्वलेट जर्सी () सर्वलेट जर्सी रेस्ट सर्विस के लिए अपवाद फेंक दिया

अपवाद रिपोर्ट लिखें

संदेश Servlet.init () सर्वलेट जर्सी रेस्ट सर्विस के लिए अपवाद फेंक दिया

वर्णन सर्वर को एक आंतरिक त्रुटि का सामना करना पड़ा जिसने उसे इस अनुरोध को पूरा करने से रोक दिया।

अपवाद

javax.servlet.ServletException: Servlet.init () सर्वलेट जर्सी REST सेवा के लिए अपवाद org। java: 79) org.apache.catalina.valves.AbstractAccessLogValve.invoke (AbstractAccessLogValve.java:624) org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:349) org.apache.coyotote.com पर क्लिक करें। सेवा (Http11Processor.java:783) org.apache.coyote.AbameterProcessorLight.process (AbstractProcessorLight.java:66) org.apache.coyote.AbrotProtocol $ ConnectionHandler.process (AbstractProtocol.java:798) org.apache.tom.ache 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.jw6.66)। थ्रेड्स। टेस्क्रेड $ WrappingRunnable.run (TaskThread.java:61) java.lang.Thread.run (Thread.java:745)

मूल कारण

java.lang.IllegalStateException: InjectionManagerFactory नहीं मिला। 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.ServletCervtainer.in.in (सर्वलेटकोर्नर .java:178) org.glassfish.jersey.servlet ServletContainer.init (ServletContainer.java:370) javax.servlet.GenericServlet.init (GenericServlet.java:158) org.apache.cnina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.jaz .jw .478)। ErrorReportValve.invoke (ErrorReportValve.java:79) org.apache.catalina.valves।

आवेदन निम्नलिखित निर्भरता के साथ निर्माण के साथ है:

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

यह डाउनलोड jersey-common-2.26-b04.jarजिसके अंतर्गत अनुपस्थित वर्ग है /org/glassfish/jersey/internal/inject/InjectionManagerFactory। जार फ़ाइल को Tomcat फ़ोल्डर में तैनात किया गया हैWEB-INF/lib

यहां क्या गलत हो सकता है? पिछले कुछ महीनों में एक ही टॉमकैट संस्करण के साथ ढाल स्क्रिप्ट ने काम किया।


1
मैं देखता हूं कि 19/05 को जर्सी का एक नया संस्करण था - जांचें कि क्या यह समस्या है, मुझे वर्तमान में एक ही समस्या है
रोमन केसलर


इस ट्यूटोरियल ने मुझे इस समस्या को ठीक करने में मदद की crunchify.com/-
JesseBoyd

जवाबों:


316

इस निर्भरता को जोड़ें:

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

सीएफ https://stackoverflow.com/a/44536542/1070215

सुनिश्चित करें कि आपके जर्सी निर्भरता संस्करणों को मिश्रण नहीं करना है। यह उत्तर संस्करण "2.28" कहता है, लेकिन जो भी आपके अन्य जर्सी निर्भरता संस्करण हैं, उसका उपयोग करें।


2
2.26 रिलीज संस्करण के साथ मेरे लिए काम किया। उत्पादन कोड में बीटा संस्करण का उपयोग नहीं करना चाहता था।
सागंस

2
धन्यवाद, यह सही उत्तर है। २.२६ के साथ काम करता है
mario

1
स्पष्टीकरण के लिए भी देखें
पॉल समसोथा

2
यह मेरे लिए था - संस्करण 2.28।
14

मेरे लिए जो बिज़ेयर था वह यह था कि यह काम कर रहा था, और फिर इसने UNTIL को काम करना बंद कर दिया मैंने इस पद के अनुसार उपरोक्त समावेश किया। किसी भी तरह, धन्यवाद। मेरा मुख्य संस्करण २.३० था और मेरा इंजेक्शन संस्करण २.२30 से ऊपर था।
बीजर

127

जर्सी 2.26 और नए पुराने संस्करणों के साथ पीछे नहीं हैं। जारी नोटों में इसके पीछे का कारण बताया गया है :

दुर्भाग्य से, 2.26 में पिछड़े असंगत परिवर्तन करने की आवश्यकता थी। पूरी तरह से जर्सी-मालिकाना प्रतिक्रियाशील क्लाइंट एपीआई पूरी तरह से चला गया है और अब किसी भी तरह का समर्थन नहीं किया जा सकता है - यह JAX-RS 2.1 में पेश किया गया था (जो कि जर्सी के लिए कीमत है "कल्पना खेल का मैदान")।

जर्सी कोड में एक और बड़ा बदलाव जर्सी कोर को किसी भी विशिष्ट इंजेक्शन ढांचे से स्वतंत्र बनाने का प्रयास है। जैसा कि आप अब कर सकते हैं, जर्सी 2.x है (है!) एचके 2 पर बहुत कसकर निर्भर है, जो कभी-कभी मुद्दों का कारण बनता है (जब अन्य इंजेक्शन कंटेनरों पर चल रहा है। जर्सी अब परिभाषित करता है कि यह इंजेक्शन इंजेक्शन है , जो ठीक से लागू होने पर, सभी को बदल देता है। आंतरिक जर्सी इंजेक्शन।


अभी के लिए किसी को निम्नलिखित निर्भरता का उपयोग करना चाहिए:

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
उच्छ्वास ... क्यों जर्सी 3.0 संस्करण को टक्कर नहीं देगा अगर वे एक परिवर्तन कर रहे हैं ..
trevorism

1
@trevorism मुझे लगता है कि वे JAX-RS प्रमुख संस्करण के साथ प्रमुख संस्करण को सिंक में रखना चाहते हैं। बस यही एक चीज है जो मेरे लिए मायने रखती है।
पॉल समसोथा

इसके अलावा जर्सी-कॉमन एक आवश्यकता नहीं है ( मैन्युअल रूप से जोड़ने के लिए)। यह पहले से ही जर्सी-सर्वर द्वारा खींचा जाना चाहिए, जिसे आपके द्वारा उपयोग की जाने वाली जर्सी-कंटेनर-सर्वलेट-कोर या किसी अन्य "मुख्य" जर्सी निर्भरता द्वारा खींचा जाना चाहिए। प्रश्न में त्रुटि से छुटकारा पाने के लिए एकमात्र आवश्यक निर्भरता जर्सी-एचके 2 (या जर्सी-सीडी 2-से, जैसा कि यहां बताया गया है ) है।
पॉल समसोथा

@ LuisF, यह सही होगा यदि इसमें अनावश्यक जर्सी-सामान्य निर्भरता शामिल नहीं थी। यह पहले से ही एक सकर्मक निर्भरता है।
पॉल समसोथा

47

यहीं कारण है। जर्सी 2.26 से शुरू, जर्सी ने हार्ड निर्भरता के रूप में एचके 2 को हटा दिया । यह के रूप में निर्भरता इंजेक्शन प्रदाता के लिए एक मुखौटा के रूप में एक एसपीआई बनाया है, InjectionManagerऔर InjectionManagerFactory। तो जर्सी को चलाने के लिए, हमें इसका कार्यान्वयन करने की आवश्यकता है InjectionManagerFactory। इसके दो कार्यान्वयन हैं, जो एचके 2 और सीडीआई के लिए हैं । HK2 निर्भरता jersey-hk2दूसरों के बारे में बात कर रहे हैं।

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

CDI निर्भरता है

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

यह (जर्सी-सीडी 2-से) केवल एसई वातावरण के लिए इस्तेमाल किया जाना चाहिए और ईई वातावरण नहीं।

जर्सी ने यह बदलाव दूसरों को अपने स्वयं के निर्भरता इंजेक्शन ढांचे को प्रदान करने के लिए किया। उनके पास किसी भी अन्य InjectionManagerएस को लागू करने की कोई योजना नहीं है , हालांकि अन्य ने गुइसे के लिए एक को लागू करने के प्रयास किए हैं ।


1
ध्यान दें कि CDI (j जर्सी-cdi2-se) का उपयोग करके META-INF में bean.xml कॉन्फ़िगरेशन की आवश्यकता है। अन्यथा निम्नलिखित अपवाद को फेंक दिया जाएगा: java.lang.IllegalStateException: WELD-ENV-000016: META-INF में मार्स बीन्स.xml फ़ाइल गुम
मार्को मोंटेल

इस उत्तर ने मुझे बहुत सी विसंगतियों से रूबरू कराया, जर्सी-सीडी -2 को स्पष्ट करने के लिए +1 का इस्तेमाल केवल SE के लिए किया जाना चाहिए
डैनियल अरेचिगा

11

जर्सी में सामान को इंजेक्ट करने के लिए कौन सा DI चुनें:

वसंत 4:

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

वसंत 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
यह इतना आसान नहीं है। आप बस स्प्रिंग के लिए एचके 2 को बंद नहीं कर सकते। jersey-springएकीकरण अभी भी हुड के नीचे एक HK2 पुल का उपयोग करता है यह काम करने के लिए।
पॉल समसोथा

2

एक ही रास्ता मैं इसे हल कर सकता था:

org.glassfish.jersey.core जर्सी-सर्वर $ {जर्सी-2-संस्करण}

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

इसलिए, केवल अगर मैंने जोड़ा jersey-container-servletऔर jersey-hk2यह त्रुटियों के बिना चलेगा


0

जहां तक ​​मैं देख सकता हूं कि 2.26-b03 और 2.26-b04 के बीच निर्भरताएं बदल गई हैं (HK2 को कंपाइल से टेस्टकंपाइल में स्थानांतरित कर दिया गया था) ... जर्सी की निर्भरता में कुछ बदलाव हो सकते हैं जो अभी तक पूरे नहीं हुए हैं (या जो आगे बढ़े हैं) एक दोष)।

हालाँकि, अभी सरल समाधान पुराने संस्करण से चिपके रहना है :-)


-2

यहाँ नई निर्भरता है (अगस्त 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>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.