केवल एनोटेशन (कोई web.xml) का उपयोग करके JAX-RS एप्लिकेशन कैसे सेट करें?


80

क्या केवल एनोटेशन का उपयोग करके JAX-RS एप्लिकेशन सेट करना संभव है? (सर्वलेट 3.0 और JAX-RS जर्सी का उपयोग 1.1.0)

मैंने कोशिश की और कोई भाग्य नहीं था। कुछ का उपयोग करना web.xmlआवश्यक लगता है।


कॉन्फ़िगरेशन A (कार्य करना, लेकिन web.xml कॉन्फ़िगरेशन है)

web.xml

   ...
   <servlet>
      <servlet-name>org.foo.rest.MyApplication</servlet-name>
   </servlet>
   <servlet-mapping>
       <servlet-name>org.foo.rest.MyApplication</servlet-name>
       <url-pattern>/*</url-pattern>
   </servlet-mapping>
   ...

जावा

@ApplicationPath("/")
public class MyApplication extends Application {
    ...
}

कॉन्फ़िगरेशन बी (काम नहीं कर रहा है, अपवाद नहीं)

@ApplicationPath("/")
@WebServlet("/*") // <-- 
public class MyApplication extends Application {
    ...
}

उत्तरार्द्ध जोर देकर कहता है कि अनुप्रयोग सर्वलेट का एक उपवर्ग होगा (अपवाद कोई अनुमान नहीं छोड़ता है)

java.lang.ClassCastException: org.foo.rest.MyApplication cannot be cast to javax.servlet.Servlet

प्रशन

  1. क्यों web.xml परिभाषा ने काम किया लेकिन एनोटेशन नहीं किया? क्या फर्क पड़ता है?

  2. क्या यह काम करने का एक तरीका है, जैसे कि JAX-RS एप्लिकेशन में कोई web.xml नहीं है?


1
यदि आप NetBeans के साथ प्रयास कर सकते हैं, तो RESTFul वेब सेवाएँ बनाने के लिए एक विज़ार्ड है। ऐसा लगता है कि आप जो करने की कोशिश कर रहे हैं वह यह है कि वर्जन 6.8 में क्या करता है। मैं 7.0.1 का उपयोग कर रहा है और नए दृष्टिकोण सरल है लेकिन इस प्रयोजन के लिए एक एकल सर्वलेट का उपयोग करता है, कि com.sun.jersey.spi.container.servlet.ServletContainer है लेकिन यह 'web.xml में परिभाषित
perissf

जवाबों:


168

** यदि आप टोमाट या जेटी का उपयोग करते हैं तो कृपया पढ़ें! **

स्वीकृत उत्तर काम करता है , लेकिन केवल अगर Webapp को ग्लासफ़िश या वाइल्डफ़्ले जैसे ऐप सर्वर पर तैनात किया जाता है, और संभवतः टॉम के जैसे ईई एक्सटेंशन वाले सर्वलेट कंटेनर। यह नहीं है टॉमकैट जैसे मानक सर्वलेट कंटेनरों पर काम , जो मुझे यकीन है कि अधिकांश लोग यहां एक समाधान की तलाश कर रहे हैं जो उपयोग करना चाहते हैं।

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

<dependencies>
  <dependency>
    <groupId>org.glassfish.jersey.bundles</groupId>
    <artifactId>jaxrs-ri</artifactId>
    <version>2.13</version>
  </dependency>
  ...
</dependencies>

फिर बस अपने प्रोजेक्ट के लिए एक एप्लिकेशन कॉन्फिग क्लास जोड़ें। यदि आपके पास बाकी सेवाओं के लिए संदर्भ पथ सेट करने से अलग कोई विशेष कॉन्फ़िगरेशन की आवश्यकता नहीं है, तो क्लास खाली हो सकती है। एक बार यह वर्ग जुड़ जाने के बाद, आपको किसी भी चीज़ को कॉन्फ़िगर करने की आवश्यकता नहीं है web.xml(या सभी में एक है):

package com.domain.mypackage;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("rest") // set the path to REST web services
public class ApplicationConfig extends Application {}

इसके बाद, अपनी वेब सेवाओं की घोषणा करना आपके जावा कक्षाओं में मानक JAX-RS एनोटेशन का उपयोग करके सीधे आगे है:

package com.domain.mypackage;
import javax.ws.rs.Consumes;
import javax.ws.rs.Produces;
import javax.ws.rs.GET;
import javax.ws.rs.MatrixParam;
import javax.ws.rs.Path;

// It's good practice to include a version number in the path so you can have
// multiple versions deployed at once. That way consumers don't need to upgrade
// right away if things are working for them.
@Path("calc/1.0")
public class CalculatorV1_0 {
  @GET
  @Consumes("text/plain")
  @Produces("text/plain")
  @Path("addTwoNumbers")
  public String add(@MatrixParam("firstNumber") int n1, @MatrixParam("secondNumber") int n2) {
    return String.valueOf(n1 + n2);
  }
}

यह आपको चाहिए। यदि आपका टोमास्क इंस्टॉल स्थानीय रूप से पोर्ट 8080 पर चल रहा है और आप अपनी WAR फाइल को इस संदर्भ में तैनात करते हैं myContext, तो ...

http://localhost:8080/myContext/rest/calc/1.0/addTwoNumbers;firstNumber=2;secondNumber=3

... अपेक्षित परिणाम (5) का उत्पादन करना चाहिए।


6
@JavaDude - आपको web.xmlमौजूद नहीं होने पर भी WAR फाइल बनाने के लिए Maven को कॉन्फ़िगर करना होगा । अपने में pom.xml, "बिल्ड> प्लगइन्स" के तहत, जोड़ें (यदि पहले से नहीं है) <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>2.3</version><configuration><failOnMissingWebXml>false</failOnMissingWebXml></configuration></plugin>:।
एल्विन थॉम्पसन

6
@JavaDude - महत्वपूर्ण हिस्सा <failOnMissingWebXml>false</fai‌​lOnMissingWebXml>विकल्प है।
एल्विन थॉम्पसन

3
@JavaDude - यदि ऐसा नहीं है, तो आप संभवतः एक ऐसा वर्ग नहीं बना सकते जो विस्तार Applicationऔर उसमें @ApplicationPathएनोटेशन जोड़े । वर्ग खाली हो सकता है, लेकिन यह होना चाहिए।
एल्विन थॉम्पसन

3
यह jersey-container-servletपूरी jaxrs-riनिर्भरता को खींचने के बिना, केवल जोड़ने के लिए पर्याप्त है । जैसे मेरे मामले में यह 'org.glassfish.jersey.core:jersey-server:2.18'+ था 'org.glassfish.jersey.containers:jersey-container-servlet:2.18'
स्तर

3
चूँकि प्रश्न "जावा-ई" के साथ स्पष्ट रूप से टैग किया गया है, इसलिए मैं एक ऐसे उत्तर को प्रदान करने और उसे उभारने के बारे में फ़िज़ को नहीं समझता, जो एक जी वातावरण को संबोधित नहीं करता है। -1
जन गलिंस्की

51

ऐसा लगता है कि मुझे यह करने की ज़रूरत है (सर्वलेट 3.0 और ऊपर)

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/*")
public class MyApplication extends Application {
    ...
}

और कोई web.xml कॉन्फ़िगरेशन स्पष्ट रूप से आवश्यक था (टॉमकैट 7 पर आजमाया गया)


1
समझ में नहीं आता कि यह कैसे काम करता है, आप किसी भी अन्य कॉन्फ़िगरेशन के बिना केवल एनोटेशन का उपयोग कर सकते हैं? मैंने इस तरह की कोशिश की है और अभी भी काम नहीं कर रहा है ...
फ़िलिप

2
@ फ़ीलिप: मैं अनुमान लगा रहा हूं कि आप टॉमकैट या किसी अन्य सर्वलेट कंटेनर का उपयोग कर रहे हैं। यह वास्तव में टॉमकैट जैसे सर्वलेट कंटेनरों पर काम नहीं करता है - यह केवल ग्लासफ़िश या वाइल्डफ़्ले जैसे ऐप सर्वर के साथ काम करता है, और शायद टॉमईई। यदि आप Tomcat का उपयोग कर रहे हैं, तो नीचे (मेरा) उत्तर देखें।
एल्विन थॉम्पसन

8
यह उत्तर टॉम्कट या जेट्टी के लिए काम नहीं करता है! कृपया उन (और अन्य) सर्वलेट कंटेनरों में काम करने के लिए मेरा उत्तर देखें।
एल्विन थॉमसन

1
अपने कार्यान्वयन के आधार पर आप करते हैं एक web.xml की जरूरत है, हालांकि एक खाली एक पर्याप्त होगा। देखें docs.jboss.org/resteasy/docs/3.0.9.Final/userguide/html_single/...
बेंजामिन Maurer

यह WebSphere Liberty पर काम करता है लेकिन WebSphere 8.x और 9.0 Classic पर नहीं।
आर्किमिडीज ट्रेजानो

15

JAX-RS का अध्याय 2 : रैस्टफुल वेब सेवा विनिर्देशन के लिए जावा ™ एपीआई सर्वलेट वातावरण (सेक्शन में 2.3.2 सर्वलेट ) में JAX-RS अनुप्रयोग की प्रकाशन प्रक्रिया का वर्णन करता है।

कृपया ध्यान दें कि सर्वलेट 3 पर्यावरण केवल अनुशंसित है (अनुभाग 2.3.2 सर्वलेट, पृष्ठ 6):

यह माना जाता है कि कार्यान्वयन कंटेनर के बीच पोर्टेबिलिटी को सक्षम करने और कंटेनर-आपूर्ति की गई क्लास स्कैनिंग सुविधाओं का लाभ उठाने के लिए सर्वलेट 3 फ्रेमवर्क प्लगगैबिलिटी तंत्र का समर्थन करता है।

संक्षेप में, यदि आप no-web.xml दृष्टिकोण का उपयोग करना चाहते हैं, तो यह javax.ws.rs.core.Application के कस्टम कार्यान्वयन के साथ संभव है जो javax.ws.rs.Applicationath एनोटेशन के साथ RESTful सेवा संसाधनों को पंजीकृत करता है ।

@ApplicationPath("/rest")

हालाँकि आपने जर्सी के बारे में विशेष रूप से पूछा है कि आप JAX-RS और WebSphere 8.5 लिबर्टी प्रोफाइल के साथ RESTful सेवाओं को लागू करने वाला लेख पढ़ना पसंद कर सकते हैं जिसमें मैंने WebSphere Liberty Profile (Apache Wink) के कार्यान्वयन के रूप में no-web.xml प्रकाशन प्रक्रिया का वर्णन किया था। JAX-RS)।


1
धन्यवाद!, मेरे पास एक और सवाल है जो दृढ़ता से संबंधित है जो मुझे पागल बना रहा है, क्या रूट में एक रास्ता है (जैसे @ApplicationPath ("/ *")) और अभी भी केवल एनोटेशन का उपयोग करके JSP की सेवा करें? (हालांकि web.xml कॉन्फ़िगरेशन के साथ भी मैं ऐसा नहीं कर सका) - सवाल यहाँ है: stackoverflow.com/questions/10874188/… , जब से आपको पता है कि JAX-RS बहुत अच्छी तरह से लगता है, क्या आप कृपया एक नज़र लेंगे? :) शायद आप देखेंगे कि मुझे क्या याद आ रहा है ... धन्यवाद!
एरन मेडन

मुझे नहीं पता। आंत की भावनाएं मुझे बताती हैं कि यह बिना किसी अतिरिक्त कॉन्फ़िगरेशन के साथ काम करना चाहिए क्योंकि अनुरोध को संभालने के लिए संसाधन को हल करने की प्रक्रिया सटीक मिलान से URL पैटर्न तक है। मैं देखूंगा और जवाब दूंगा। मुझे अपने ज्ञान का विस्तार करने के लिए प्रोत्साहित करने के लिए धन्यवाद! :-)
जसक लस्कॉस्की

@ApplicationPath("")JBoss EAP 7 पर रूट (वेबएप के संदर्भ-रूट के सापेक्ष) में मेरी REST सेवाओं का उपयोग करते हुए Im 7. मेरे पास न तो है beans.xmlऔर न ही web.xml
जुलिएन क्रोनग

7

आपको pom.xml में सही निर्भरता सेटअप करने की आवश्यकता है

<dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.0.1</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
    </dependency>

यहां अधिक विवरण: जैक्स-आरएस के लिए स्टार्टर उदाहरण


अगर संसाधनकॉन्फ़िग / एप्लिकेशन का उपयोग किया जाता है तो क्या मैं web.xml हटा सकता हूं?
बीएई

हां, लेकिन आपको इसे pom.xml i fusnig mave में जोड़ने की आवश्यकता है:<failOnMissingWebXml>
ACV

धन्यवाद। लेकिन वहाँ कुछ भी है web.xml कर सकते हैं, लेकिन संसाधनकंफिग नहीं कर सकते हैं?
BAE

नहीं, मुझे लगता है कि सर्वलेट युक्ति 3.0 web.xml की अब आवश्यकता नहीं है। लेकिन कभी-कभी यह web.xml का उपयोग करने के लिए अधिक सुविधाजनक होता है क्योंकि अगर आपको कुछ बदलना है तो उसे पुनर्संयोजन की आवश्यकता नहीं है।
एसीवी

और क्या होगा यदि आप मावेन का उपयोग नहीं कर रहे हैं ? मेरा प्रोजेक्ट अभी वापस स्विच करने के लिए बहुत बड़ा है।
TheRealChx101

1

पहले बताई गई निर्भरताएँ मेरे काम नहीं आईं। जर्सी उपयोगकर्ता गाइड से:

जर्सी दो सर्वलेट मॉड्यूल प्रदान करता है। पहला मॉड्यूल जर्सी कोर सर्वलेट मॉड्यूल है जो कोर सर्वलेट एकीकरण समर्थन प्रदान करता है और किसी भी सर्वलेट 2.5 या उच्च कंटेनर में आवश्यक है:

<dependency>
 <groupId>org.glassfish.jersey.containers</groupId>
 <artifactId>jersey-container-servlet-core</artifactId>
</dependency>

अतिरिक्त सर्वलेट 3.x परिनियोजन मोड और अतुल्यकालिक JAX-RS संसाधन प्रोग्रामिंग मॉडल का समर्थन करने के लिए, एक अतिरिक्त जर्सी मॉड्यूल की आवश्यकता है:

<dependency>
 <groupId>org.glassfish.jersey.containers</groupId>
 <artifactId>jersey-container-servlet</artifactId>
</dependency>

जर्सी-कंटेनर-सर्वलेट मॉड्यूल जर्सी-कंटेनर-सर्वलेट-कोर मॉड्यूल पर निर्भर करता है, इसलिए जब इसका उपयोग किया जाता है, तो जर्सी-कंटेनर-सर्वलेट-कोर निर्भरता को स्पष्ट रूप से घोषित करना आवश्यक नहीं है।

https://jersey.github.io/documentation/latest/deployment.html#deployment.servlet.3


0

जैसा कि @ Eran-Medan ने बताया, JBoss EAP 7.1 (वेब ​​एप्लिकेशन के बिना नोट इसलिए कोई सर्वलेट नहीं है, मैं इसे EJB 3.2 परियोजना में कर रहा था) मुझे "मान" विशेषता को जोड़ना था जैसे कि मुझे एक अपवाद मिल रहा था कि मूल्य विशेषता की आवश्यकता थी।

इसने मेरे लिए काम किया

    @ApplicationPath(value="/*")
        public class MyApplication extends Application {

            private Set singletons = new HashSet();

            public MyApplication() {
                singletons.add(new MyService());
            }

            ...
    }

स्टैक ट्रेस

    Caused by: java.lang.annotation.IncompleteAnnotationException: javax.ws.rs.ApplicationPath missing element value
        at sun.reflect.annotation.AnnotationInvocationHandler.invoke(AnnotationInvocationHandler.java:80)
        at com.sun.proxy.$Proxy141.value(Unknown Source)
        ... 21 more
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.