2012-10-11 7 views
7

मैं एक मौजूदा कोड पर काम कर रहा हूं जो दूसरे नियंत्रक पर एक विधि को कॉल करने के लिए एक नियंत्रक का उपयोग कर रहा है। अब तक 2 कार्यान्वयन हुए हैं।स्प्रिंग एमवीसी, एक नियंत्रक के अंदर से एक और नियंत्रक को बुला रहा है

1 कार्यान्वयन

return new Controller().method(request, response); 

2 कार्यान्वयन

@Autowired 
private Controller controller. 

return this.controller.method(request, response); 

सही कार्यान्वयन, क्या समस्याएं हैं है जो उनमें से किसी के साथ यदि कोई हो।

+0

इसका क्या फायदा है? ऐसा करने से बहुत सारे सम्मेलन टूट जाते हैं, और आपको संशोधित करने पर विचार करना चाहिए, यानी नियंत्रक कोड को तोड़ना और शायद कुछ तर्क को व्यावसायिक परत में ले जाना चाहिए। अच्छे अभ्यास के लिए – dardo

उत्तर

9

केवल एक तथ्य यह है कि आपको किसी अन्य नियंत्रक से एक विधि को कॉल करने की आवश्यकता है, एक संभावित डिजाइन दोष प्रकट करता है।

विकल्प 1 के साथ, आप वसंत डी कंटेनर को जो कुछ भी लाए हैं, उसे खो देते हैं: अर्थात्, उस अन्य नियंत्रक को स्प्रिंग द्वारा तत्काल कुछ अन्य निर्भरताओं के साथ चालू किया जा सकता है। यदि आप इसे स्वयं को तत्काल बनाते हैं, भले ही यह इस समय काम करता है, क्योंकि आपके पास शायद @Autowired/@Value निर्भरता नहीं है, तो यह एक बार टूट जाएगा जब आप अन्य संसाधनों पर निर्भरता जोड़ देंगे। इसके अलावा, आपके पास पहले से ही एक कंटेनर है जो आपके लिए बनाया गया है, दूसरों को क्यों बनाते हैं?

0

दूसरा एक सही है क्योंकि आप हर बार इसका उदाहरण नहीं देंगे। @Autowired एनोटेशन जब आवश्यक हो तो ऑब्जेक्ट को आपके कोड में इंजेक्ट करता है।

चेक इस http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/beans/factory/annotation/Autowired.html

लेकिन वहाँ एक @Controller एनोटेशन है और आप नियंत्रकों और @Service सेम आप autowire चाहते हैं के लिए के लिए उपयोग करना चाहिए कि।

1

पहले को और अधिक काम की ज़रूरत है, सबसे पहले आप वास्तव में कंट्रोलर क्लास का एक नया उदाहरण बनाना चाहते हैं?

दूसरा एक पैटर्न का उपयोग करता है जिसे निर्भरता इंजेक्शन या नियंत्रण में उलटा कहा जाता है जो कि अच्छा है। वसंत को आपके लिए बीन का दायरा प्रबंधित करने दें, डिफ़ॉल्ट रूप से यह नियंत्रक वर्ग का केवल 1 उदाहरण बनाएगा, हालांकि अगर किसी बिंदु पर (किसी कारण से) आप नहीं चाहते हैं कि यह व्यवहार कई उदाहरणों को बनाने के लिए सीधा है ...

9

लगता है जैसे आपको कोड को दोबारा करने की आवश्यकता है। दो नियंत्रकों के बीच एक अलग वर्ग में आम बातों को निकालें, फिर किसी भी नियंत्रक से कॉल करें।

+2

+1, और मिल्वौकी से होने के लिए, और मूल रूप से मेरी टिप्पणी दोहराए जाने के लिए। – dardo

4

आप पूरी तरह गलत कर रहे हैं। क्या गलत है इसके लिए Costi Ciudatu's उत्तर देखें।

समाधान: मुझे सलाह है कि आप service layer and dao layer classes अपने controllers से जुड़े हों। मान लें कि आपके पास AccountController है, आपके पास AccountService कक्षा (इंटरफ़ेस + कार्यान्वयन) और AccountDao (इंटरफ़ेस + कार्यान्वयन) होगा।

अब में (LoginController) उपयोगकर्ता के लॉग और आप खाते की आवश्यकता है ताकि आप LoginController में AccountService autowire करेंगे, तो आप AccountService तरीकों से उपयोगकर्ता का खाता विवरण प्राप्त होगा।

9

यदि आप नियंत्रकों के बीच कॉल करते हैं, तो या तो कोई दोष है या आप एक पुनर्निर्देशन करना चाहते हैं, जो पूरी तरह मान्य है। यदि पुनर्निर्देशन मामला बस आपके नियंत्रक विधि में निम्नानुसार है:

return "redirect:/yourDestinationControllerPath";