जवाबों:
@Controller
स्प्रिंग MVC नियंत्रक के रूप में कक्षाओं को चिह्नित करने के लिए उपयोग किया जाता है।@RestController
एक सुविधा एनोटेशन है जो एनोटेशन @Controller
और @ResponseBody
एनोटेशन जोड़ने से ज्यादा कुछ नहीं करता है (देखें: जावदोक )तो निम्नलिखित दो नियंत्रक परिभाषाओं को ऐसा ही करना चाहिए
@Controller
@ResponseBody
public class MyController { }
@RestController
public class MyRestController { }
Thymeleaf
यह इस एनोटेशन में शामिल होने के @RestController
कारण काम नहीं करेगा @ResponseBody
।
@ResponseBody
लौटी हुई वस्तुओं को शरीर में होने वाली किसी वस्तु के लिए बनाता है, जैसे कि JSON या XML ( स्रोत )
नीचे दिए गए कोड में मैं आपको अंतर दिखाऊंगा @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
डिफ़ॉल्ट रूप से सक्रिय है। आपको इसे फ़ंक्शन हस्ताक्षर के ऊपर जोड़ने की आवश्यकता नहीं है।
यदि आप उपयोग @RestController
करते हैं तो आप एक दृश्य ( Viewresolver
स्प्रिंग / स्प्रिंगबूट में उपयोग करके ) वापस नहीं कर सकते हैं और @ResponseBody
इस मामले में हाँ की आवश्यकता नहीं है।
यदि आप उपयोग @Controller
करते हैं तो आप स्प्रिंग वेब MVC में एक दृश्य वापस कर सकते हैं।
@RestController
एनोटेट कक्षाएं समान हैं, @Controller
लेकिन @ResponseBody
हैंडलर विधियों पर निहित हैं।
वास्तव में, सावधान रहें - वे बिल्कुल समान नहीं हैं।
यदि आप अपने आवेदन के भीतर किसी भी इंटरसेप्टर को परिभाषित करते हैं, तो वे एनरोल किए गए नियंत्रकों पर लागू नहीं होंगे @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 {...
इंटरसेप्टर के इसके साथ जुड़े होने का अंत नहीं है।
@RestController
स्प्रिंग 4x में पेश किया गया था। यह एनोटेशन स्वयं भी एनोटेट किया जाता @Controller
है, यदि यह @Controller
बग की तरह रिपोर्ट नहीं करता है।
Interceptor
को जोड़ सकते हैं @RestController
।
Interceptor
से जुड़ा हुआ हूं @RestController
।
जैसा कि आप स्प्रिंग डॉक्यूमेंटेशन ( स्प्रिंग रेस्टकंट्रोलर डॉक्यूमेंटेशन ) में देख सकते हैं, रेस्ट कंट्रोलर एनोटेशन कंट्रोलर एनोटेशन के समान है, लेकिन यह मानते हुए कि @ResponseBody डिफ़ॉल्ट रूप से सक्रिय है, इसलिए सभी जोंस को ऑब्जेक्ट्स में पार्स किया जाता है।
@RestController
वसंत 4.0.1 के बाद से प्रदान किया गया था। ये नियंत्रक संकेत देते हैं कि यहां @RequestMapping विधियां डिफ़ॉल्ट रूप से @ResponseBody शब्दार्थ का अनुमान लगाती हैं।
पहले के संस्करणों में इसी तरह की कार्यक्षमता नीचे इस्तेमाल करके हासिल की जा सकती है:
@RequestMapping
के साथ मिलकर @ResponseBody
की तरह@RequestMapping(value = "/abc", method = RequestMethod.GET, produces ="application/xml")
public @ResponseBody MyBean fetch(){
return new MyBean("hi")
}
<mvc:annotation-driven/>
जैक्सन या xml के साथ JSON का उपयोग करने के तरीकों में से एक के रूप में इस्तेमाल किया जा सकता है।
@XmlRootElement(name = "MyBean")
@XmlType(propOrder = {"field2", "field1"})
public class MyBean{
field1
field2 ..
//getter, setter
}
@ResponseBody
एमवीसी के बीच यहां के दृश्य के रूप में माना जाता है और इसे डिस्पैचर सर्वलेट से भेजे जाने के बजाय सीधे भेजा जाता है और संबंधित कन्वर्टर्स पाठ / एचटीएमएल, एप्लिकेशन / एक्सएमएल, एप्लिकेशन / जसन जैसे संबंधित प्रारूप में प्रतिक्रिया को परिवर्तित करते हैं।हालाँकि, रेस्टकंट्रोलर पहले से ही रिस्पॉन्सबॉडी और संबंधित कन्वर्टर्स के साथ युग्मित है। दूसरे, यहाँ, जब से responsebody को परिवर्तित करने के बजाय, यह स्वचालित रूप से http प्रतिक्रिया में परिवर्तित हो जाता है।
Restful वेब सेवाओं के निर्माण को आसान बनाने के लिए @RestController एनोटेशन को स्प्रिंग 4.0 में पेश किया गया था। यह एक सुविधा एनोटेशन है जो @Controller और @ResponseBody को जोड़ता है - जो @ResponseBody एनोटेशन के साथ कंट्रोलर क्लास के हर अनुरोध को हैंडल करने की आवश्यकता को समाप्त करता है।
@Controller
: यह एनोटेशन सिर्फ एक विशेष संस्करण है @Component
और यह क्लासपैथ स्कैनिंग के आधार पर नियंत्रक कक्षाओं को ऑटो-डिटेक्ट करने की अनुमति देता है।@RestController
: यह एनोटेशन स्वचालित रूप से @Controller
जोड़ा @Controller
और एनोटेशन का एक विशेष संस्करण है, @ResponseBody
इसलिए हमें @ResponseBody
अपनी मैपिंग विधियों में जोड़ना नहीं है ।@ कंट्रोलर का उपयोग विरासत प्रणालियों में किया जाता है जो JSPs का उपयोग करते हैं। यह दृश्य वापस कर सकता है। @RestController को चिह्नित करना है कि नियंत्रक JSON प्रतिक्रिया प्रकार के साथ अन्य सेवाएं प्रदान कर रहा है। इसलिए यह @Controller और @ResponseBody एनोटेशन को एक साथ लपेटता है।
@Controller और @ResponseBody का उपयोग करने के बजाय, @RestController चलो आपको स्प्रिंग 4.0 और इसके बाद के संस्करण में बाकी एपीआई का पर्दाफाश करते हैं।