2011-01-15 16 views
6

स्प्रिंग 3 संदर्भ सिखाता है:विधि तर्क स्तर पर @ModelAttribute एनोटेशन का अर्थ क्या है?

जब आप एक विधि पैरामीटर पर रखें, @ModelAttribute विशिष्ट, एनोटेट विधि पैरामीटर

करने के लिए एक मॉडल विशेषता नक्शे मुझे यह समझ में नहीं आता जादू जादू, क्योंकि मुझे यकीन है कि मॉडल ऑब्जेक्ट के उपनाम (ModelMap का उपयोग रिटर्न प्रकार के रूप में करते हुए महत्वपूर्ण मान) अनुरोध हैंडलर विधि निष्पादित करने के बाद दृश्य में पारित किया गया है। इसलिए जब अनुरोध हैंडलर विधि निष्पादित करता है मॉडल ऑब्जेक्ट का नाम विधि पैरामीटर में मैप नहीं किया जा सकता है।

इस विरोधाभास को हल करने के लिए मैं stackoverflow गया और this विस्तृत उदाहरण पाया। उदाहरण के लेखक ने कहा:

// "personAttribute" मॉडल JSP

ऐसा लगता है से नियंत्रक करने के लिए पारित किया गया है, वह वसंत संदर्भ से सम्मोहित कर रहा है ...

आकर्षण को दूर करने के लिए मैंने अपने पर्यावरण में अपने नमूना ऐप को तैनात किया और विधि MainController.saveEdit() से @ModelAttribute एनोटेशन को क्रूर रूप से काट दिया। नतीजतन आवेदन बिना किसी बदलाव के काम करता है! तो मैं निष्कर्ष निकाला हूं: @ModelAttribute तर्क के फ़ील्ड में वेब फ़ॉर्म के फ़ील्ड मानों को पारित करने के लिए एनोटेशन की आवश्यकता नहीं है। फिर मैं सवाल पर अटक गया: @ModelAttribute एनोटेशन का क्या अर्थ है? यदि एकमात्र मतलब मॉडल ऑब्जेक्ट के लिए उपनाम सेट करना है, तो ModelMap पर ऑब्जेक्ट को स्पष्ट रूप से जोड़ने से बेहतर क्यों है?

उत्तर

8

मुद्दा यह है कि @ModelAttribute वैकल्पिक है है - अगर तर्क एनोटेट नहीं है और अपनी तरह कोई विशेष अर्थ नहीं है (यानी यह HttpServletRequest, ModelMap और इतने पर नहीं है), यह @ModelAttribute -annotated तर्क की तरह व्यवहार किया है।

तो, @ModelAttribute प्रभावी रूप से दो मामलों में की जरूरत है:

  • विशेषता का नाम निर्दिष्ट करने के लिए। यदि @ModelAttribute छोड़ा गया है या खाली value है, तो डिफ़ॉल्ट नाम का उपयोग किया जाता है (पहले अक्षर decapitalized के साथ तर्क का नाम टाइप करें)।

  • यदि तर्क का प्रकार एक विशेष अर्थ है। उदाहरण के लिए, यदि आपकी डोमेन ऑब्जेक्ट को java.security.Principal तक विस्तारित किया गया है, तो आपको इसे एनोटेट करना होगा, अन्यथा स्प्रिंग HttpServletRequest.getUserPrincipal() के परिणामस्वरूप पास हो जाएगी।

कुछ लोगों को आदेश तर्क के अर्थ दस्तावेज़ीकरण के लिए वास्तविक आवश्यकता के बिना @ModelAttribute इस्तेमाल करते हैं।

संबंधित मुद्दे