java - वसंत @ नियंत्रक और @RestController एनोटेशन के बीच अंतर




spring spring-mvc (8)

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

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

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


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

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

अर्थात। इंटरसेप्टर के लिए विन्यास:

@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 {...

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


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


नीचे दिए गए कोड में मैं आपको @controller साथ अंतर @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 डिफ़ॉल्ट रूप से सक्रिय है, आपको इसे फ़ंक्शन हस्ताक्षर के ऊपर में जोड़ने की आवश्यकता नहीं है


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


@RestController एनोटेटेड कक्षाएं @RestController के समान हैं लेकिन हैंडलर विधियों पर @ResponseBody को निहित किया गया है।


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

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

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

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

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

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

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

हालांकि, Restcontroller पहले से ही ResponseBody और संबंधित कन्वर्टर्स के साथ मिलकर है। दूसरा, यहां, प्रतिक्रियाकर्ता को बदलने की बजाय, यह स्वचालित रूप से http प्रतिक्रिया में परिवर्तित हो जाता है।


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

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

@Controller
@ResponseBody
public class MyController { }

@RestController
public class MyRestController { }





spring-mvc