वसंत के बीच अंतर @Controller और @RestController एनोटेशन


356

वसंत @Controllerऔर @RestControllerएनोटेशन के बीच अंतर ।

क्या @Controllerएनोटेशन का उपयोग वेब MVC और REST अनुप्रयोगों दोनों के लिए किया जा सकता है?
यदि हाँ, तो हम कैसे अलग कर सकते हैं यदि यह वेब MVC या REST अनुप्रयोग है।

जवाबों:


471
  • @Controller स्प्रिंग MVC नियंत्रक के रूप में कक्षाओं को चिह्नित करने के लिए उपयोग किया जाता है।
  • @RestControllerएक सुविधा एनोटेशन है जो एनोटेशन @Controllerऔर @ResponseBodyएनोटेशन जोड़ने से ज्यादा कुछ नहीं करता है (देखें: जावदोक )

तो निम्नलिखित दो नियंत्रक परिभाषाओं को ऐसा ही करना चाहिए

@Controller
@ResponseBody
public class MyController { }

@RestController
public class MyRestController { }


48
मुझे लगता है कि @RestController भी JSON / XML की प्रतिक्रिया को स्वचालित रूप से परिवर्तित करता है।
अर्नबकायस

1
बस एक स्प्रिंग ट्यूटोरियल के लिंक को साझा करते हुए अंतर को समझाते हुए स्प्रिंग ।io
मीना समी

9
इसके अलावा, यदि आप टेम्पलेट इंजन का उपयोग करते हैं तो Thymeleafयह इस एनोटेशन में शामिल होने के @RestControllerकारण काम नहीं करेगा @ResponseBody
सोना

3
@ResponseBodyलौटी हुई वस्तुओं को शरीर में होने वाली किसी वस्तु के लिए बनाता है, जैसे कि JSON या XML ( स्रोत )
मार्टिन थोमा

59

नीचे दिए गए कोड में मैं आपको अंतर दिखाऊंगा @controller

@Controller
public class RestClassName{

  @RequestMapping(value={"/uri"})
  @ResponseBody
  public ObjectResponse functionRestName(){
      //...
      return instance
   }
}

तथा @RestController

@RestController
public class RestClassName{

  @RequestMapping(value={"/uri"})
  public ObjectResponse functionRestName(){
      //...
      return instance
   }
}

@ResponseBodyडिफ़ॉल्ट रूप से सक्रिय है। आपको इसे फ़ंक्शन हस्ताक्षर के ऊपर जोड़ने की आवश्यकता नहीं है।


1
जावा में वर्ग नामों को पूंजीकृत करना शुरू करना चाहिए, अर्थात रेस्टक्लासनाम (रेस्टक्लासनाम नहीं)।
कोलाहलपूर्ण

24

यदि आप उपयोग @RestControllerकरते हैं तो आप एक दृश्य ( Viewresolverस्प्रिंग / स्प्रिंगबूट में उपयोग करके ) वापस नहीं कर सकते हैं और @ResponseBodyइस मामले में हाँ की आवश्यकता नहीं है।

यदि आप उपयोग @Controllerकरते हैं तो आप स्प्रिंग वेब MVC में एक दृश्य वापस कर सकते हैं।


हां, @ResponseBody को एक विधि पर रखा जा सकता है और यह इंगित करता है कि रिटर्न प्रकार को सीधे HTTP प्रतिसाद बॉडी पर लिखा जाना चाहिए (और इसे किसी मॉडल में नहीं रखा जाना चाहिए, या एक दृश्य नाम के रूप में व्याख्या किया गया है)
प्रवीणकुमार लालसंगी


14

वास्तव में, सावधान रहें - वे बिल्कुल समान नहीं हैं।

यदि आप अपने आवेदन के भीतर किसी भी इंटरसेप्टर को परिभाषित करते हैं, तो वे एनरोल किए गए नियंत्रकों पर लागू नहीं होंगे @RestController, हालांकि वे @Controllerएनोटेट नियंत्रक के साथ काम करते हैं ।

अर्थात। इंटरसेप्टर के लिए कॉन्फ़िगरेशन:

@Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new TemplateMappingInterceptor()).addPathPatterns("/**", "/admin-functions**").excludePathPatterns("/login**");
    }

}

और एक वसंत नियंत्रक की घोषणा में:

@Controller
public class AdminServiceController {...

हालांकि काम करेंगे

@RestController
public class AdminServiceController {...

इंटरसेप्टर के इसके साथ जुड़े होने का अंत नहीं है।


2
@RestControllerस्प्रिंग 4x में पेश किया गया था। यह एनोटेशन स्वयं भी एनोटेट किया जाता @Controllerहै, यदि यह @Controllerबग की तरह रिपोर्ट नहीं करता है।
गौगांग

@bertybro, यह बिल्कुल सही नहीं है। आप एक Interceptorको जोड़ सकते हैं @RestController
रवि-ए-डोअर

मैं निश्चित रूप से सफलतापूर्वक एक Interceptorसे जुड़ा हुआ हूं @RestController
बेन बार्डन

11

जैसा कि आप स्प्रिंग डॉक्यूमेंटेशन ( स्प्रिंग रेस्टकंट्रोलर डॉक्यूमेंटेशन ) में देख सकते हैं, रेस्ट कंट्रोलर एनोटेशन कंट्रोलर एनोटेशन के समान है, लेकिन यह मानते हुए कि @ResponseBody डिफ़ॉल्ट रूप से सक्रिय है, इसलिए सभी जोंस को ऑब्जेक्ट्स में पार्स किया जाता है।


4

स्प्रिंग 4+ में नया @RestController एनोटेशन, जो वर्ग को एक नियंत्रक के रूप में चिह्नित करता है जहां हर विधि एक दृश्य के बजाय एक डोमेन ऑब्जेक्ट देता है। यह @Controller और @ResponseBody के लिए शॉर्टहैंड एक साथ लुढ़का है।


3

@RestControllerवसंत 4.0.1 के बाद से प्रदान किया गया था। ये नियंत्रक संकेत देते हैं कि यहां @RequestMapping विधियां डिफ़ॉल्ट रूप से @ResponseBody शब्दार्थ का अनुमान लगाती हैं।

पहले के संस्करणों में इसी तरह की कार्यक्षमता नीचे इस्तेमाल करके हासिल की जा सकती है:

  1. @RequestMappingके साथ मिलकर @ResponseBodyकी तरह@RequestMapping(value = "/abc", method = RequestMethod.GET, produces ="application/xml") public @ResponseBody MyBean fetch(){ return new MyBean("hi") }

  2. <mvc:annotation-driven/> जैक्सन या xml के साथ JSON का उपयोग करने के तरीकों में से एक के रूप में इस्तेमाल किया जा सकता है।

  3. MyBean को परिभाषित किया जा सकता है

@XmlRootElement(name = "MyBean") @XmlType(propOrder = {"field2", "field1"}) public class MyBean{ field1 field2 .. //getter, setter }

  1. @ResponseBody एमवीसी के बीच यहां के दृश्य के रूप में माना जाता है और इसे डिस्पैचर सर्वलेट से भेजे जाने के बजाय सीधे भेजा जाता है और संबंधित कन्वर्टर्स पाठ / एचटीएमएल, एप्लिकेशन / एक्सएमएल, एप्लिकेशन / जसन जैसे संबंधित प्रारूप में प्रतिक्रिया को परिवर्तित करते हैं।

हालाँकि, रेस्टकंट्रोलर पहले से ही रिस्पॉन्सबॉडी और संबंधित कन्वर्टर्स के साथ युग्मित है। दूसरे, यहाँ, जब से responsebody को परिवर्तित करने के बजाय, यह स्वचालित रूप से http प्रतिक्रिया में परिवर्तित हो जाता है।


2

@Controllerलौटता है View@RestControllerलौटता है ResponseBody


2
आपको और समझाना चाहिए। यह सवाल का जवाब कैसे दे रहा है?
यूनानोश

@Yunnosch 'दृश्य' आपका अगला छोर है जैसे jsp या html। ResponseBody xml, json, yaml
G.Brown

उपयोगी जानकारी जोड़ने के लिए कृपया अपना उत्तर संपादित करें। हालांकि मुझे अभी भी यह नहीं मिला है कि इस सवाल का जवाब कैसे देना चाहिए। क्या आप "हां कर सकते हैं / नहीं आप नहीं कर सकते, क्योंकि ...." जैसे स्पष्टीकरण को वाक्यांश बना सकते हैं।
युन्नोश

1

Restful वेब सेवाओं के निर्माण को आसान बनाने के लिए @RestController एनोटेशन को स्प्रिंग 4.0 में पेश किया गया था। यह एक सुविधा एनोटेशन है जो @Controller और @ResponseBody को जोड़ता है - जो @ResponseBody एनोटेशन के साथ कंट्रोलर क्लास के हर अनुरोध को हैंडल करने की आवश्यकता को समाप्त करता है।


0
  • @Controller: यह एनोटेशन सिर्फ एक विशेष संस्करण है @Componentऔर यह क्लासपैथ स्कैनिंग के आधार पर नियंत्रक कक्षाओं को ऑटो-डिटेक्ट करने की अनुमति देता है।
  • @RestController: यह एनोटेशन स्वचालित रूप से @Controllerजोड़ा @Controllerऔर एनोटेशन का एक विशेष संस्करण है, @ResponseBodyइसलिए हमें @ResponseBodyअपनी मैपिंग विधियों में जोड़ना नहीं है ।

0

@ कंट्रोलर का उपयोग विरासत प्रणालियों में किया जाता है जो JSPs का उपयोग करते हैं। यह दृश्य वापस कर सकता है। @RestController को चिह्नित करना है कि नियंत्रक JSON प्रतिक्रिया प्रकार के साथ अन्य सेवाएं प्रदान कर रहा है। इसलिए यह @Controller और @ResponseBody एनोटेशन को एक साथ लपेटता है।


-3

@RestControllerकी रचना है @Controllerऔर @ResponseBodyअगर हम उपयोग नहीं कर रहे, @ResponseBodyविधि हस्ताक्षर में तो हम उपयोग करने की आवश्यकता @Restcontroller


-3

@Controller और @ResponseBody का उपयोग करने के बजाय, @RestController चलो आपको स्प्रिंग 4.0 और इसके बाद के संस्करण में बाकी एपीआई का पर्दाफाश करते हैं।


आप यह कहना चाहते हैं कि मुझे लगता है कि @RestController भी JSON / XML की प्रतिक्रिया को स्वचालित रूप से परिवर्तित करता है। ? आपने स्पष्ट रूप से समझाने के बजाय एक अमूर्त वाक्य का उपयोग किया, मैं यह सुझाव नहीं दूंगा।
CinqS

यह सोचने के लिए आओ, @ कंट्रोलर वैसा ही करता है जैसे कि यह एचटीई उत्पादन लेता है और माइम प्रकार के JSON / XML का उपयोग करता है या अन्यथा ... @ ResponseBody कंट्रोलर से कहता है कि बिना व्यू पैदा किए REST एंडपॉइंट की तरह व्यवहार करें। RestController निहित है कि।
कॉफ़ीबेनी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.