2010-12-02 13 views
6

इस तरह का कोड की कल्पना इससे पहले कि मेरे उपयोगकर्ता ऑब्जेक्ट बाध्य है। तो जब मैं initBinder() और readyUser() को आमंत्रित/उपयोगकर्ता/सहेजता हूं तो निष्पादित किया जाता है।@ModelAttribute

मैंने @InitBinder और @ModelAttribute दोनों में "उपयोगकर्ता" सेट किया है, इसलिए स्प्रिंग-एमवीसी समझ सकता है कि यह विधियां केवल @ModelAttribute ("user") के साथ एक विधि निष्पादित करने से पहले लागू की जानी चाहिए।

समस्या यह है कि @ModelAttribute ("user") के साथ एनोटेटेड विधि को इस नियंत्रक के प्रत्येक मैप किए गए विधि से पहले निष्पादित किया जाता है। उदाहरण के लिए यदि मैं/उपयोगकर्ता तैयार करता हूं तो उपयोगकर्ता सूची() विधि से पहले निष्पादित किया जाता है। मैं यह कैसे बना सकता हूं कि यह तैयारकर्ता केवल उसी नियंत्रक में सभी विधियों को सहेजने() विधि से पहले निष्पादित किया गया हो?

धन्यवाद

+0

वास्तव में 'readyUser' क्या करता है? – skaffman

+0

@ स्काफमैन यह उपयोगकर्ता नाम को लेता है और उपयोगकर्ता ऑब्जेक्ट को डेटाबेस से लोड करता है, इसलिए सभी डेटा जिन्हें बाध्य नहीं किया जा सकता है (उदाहरण के लिए पासवर्ड) शून्य मानों के साथ ओवरराइट नहीं किया जाता है जब यह – Javi

उत्तर

7

यह वास्तव में नहीं है क्या @ModelAttribute के लिए है। यदि आप इसे विधि पैरामीटर के रूप में उपयोग करते हैं, तो यह एनोटेटेड पैरामीटर को मॉडल में रखता है (यह ठीक है)। यदि आप इसे किसी विधि पर डालते हैं, तो इसे संदर्भ डेटा प्रदान करने के लिए हर बार कहा जाता है कि नियंत्रक में प्रत्येक विधि तक पहुंच होनी चाहिए।

यदि आप अपने उपयोगकर्ता ऑब्जेक्ट को बनाने का नियंत्रण रखना चाहते हैं, तो आपके पास कई विकल्प हैं। दो जो मेरे लिए सबसे स्पष्ट कर रहे हैं:

  1. उपयोगकर्ता वस्तुओं के निर्माण के लिए एक नए कस्टम संपादक (एक PropertyEditor वर्ग) जोड़ने के लिए,
  2. conversion service in Spring 3 का उपयोग उपयोगकर्ता वस्तुओं के लिए स्ट्रिंग उपयोगकर्ता नाम परिवर्तित करने के लिए अपने InitBinder विधि का उपयोग करें।
+0

बाध्य करने के बाद जारी रहता है ठीक है, मैं समझता हूं कि यह किया जाना चाहिए एक संपत्ति संपादक के साथ initbinder में, लेकिन मुझे समझ में नहीं आता @ModelAttribute एनोटेशन के साथ तरीकों के लिए असली उद्देश्य क्या है। क्या आप मुझे अपने सामान्य उपयोग के लिए एक उदाहरण बता सकते हैं? और, एनोटेशन में मूल्य के रूप में दिया गया स्ट्रिंग क्यों हो सकता है (उदाहरण के लिए @ModelAttribute ("user") में "उपयोगकर्ता") यदि यह हर विधि से पहले निष्पादित किया जाता है? – Javi

+1

@Javi अच्छे प्रश्न। सबसे पहले, मुझे नहीं लगता कि यह * initbinder में किया जाना चाहिए, यह बस संभव है। मैं अधिक आधुनिक रूपांतरण सेवा दृष्टिकोण पसंद करता हूं। @ModelAttribute के साथ एनोटेटेड विधियों के लिए एक सामान्य उपयोग संदर्भ डेटा के लिए है कि नियंत्रक में सभी विधियों की आवश्यकता होती है। एक उदाहरण के रूप में एक पालतू स्टोर का उपयोग करने के लिए, नियंत्रक के पास पालतू जानवरों को सूचीबद्ध करने और व्यक्तिगत पालतू जानवरों को देखने के तरीके हो सकते हैं, लेकिन उन्हें सभी को एक श्रेणियाँ मेनू ("खरगोश", "कुत्तों" आदि) के लिए जानकारी चाहिए। यह आपको प्रत्येक विधि में दोहराने के लिए बचाता है। – GaryF

+2

@Javi आप इसे क्यों नाम दे सकते हैं, इसलिए वसंत वापस लौटे ऑब्जेक्ट को उस नाम के तहत मॉडल में डाल सकता है। स्प्रिंग मैनुअल में उदाहरण एक लायक है: http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-modelattrib – GaryF

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