जवाबों:
@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 और इसके बाद के संस्करण में बाकी एपीआई का पर्दाफाश करते हैं।