वसंत-servlet.xml का कारण बनता है मेरे इंटरसेप्टर को किसी भी वसंत से पहले बुलाया जाता है नियंत्रक विधि जो Validator
एनोटेशन के साथ एनोटेटेड है। अगर अनुरोध विफल रहता है, तो अनुरोध को सत्यापित करना है, अनुरोध को एक अलग दृश्य के लिए अग्रेषित करें। यह आमतौर पर काम कर रहा है। अगर (!valid)
में कोई त्रुटि है, तो RequestDispatcher.forward
कहा जाता है। इससे एक और वसंत नियंत्रक विधि को बुलाया जाता है जो अंततः त्रुटि दृश्य दिखाता है। यह सामान्य रूप से काम करता है।स्प्रिंग AOP पुनरावर्ती कॉल
मुद्दा:
कुछ वसंत नियंत्रकों के लिए, मेरे RequestDispatcher के errorView
अनुरोध वापस अनंत लूप के कारण ही विधि के लिए (invoke()
से अधिक कहा जाता है और अधिक हो जाता है) को अग्रेषित किए जाने का कारण बनता है। मुझे लगता है कि इस वजह से स्प्रिंग नियंत्रक के अनुरोध मैपिंग (नीचे देखें) कैसे स्थापित किए गए हैं।
त्रुटि दृश्य: @RequestMapping(value = URL, params="error")
सामान्य दृश्य: @RequestMapping(value = URL, params="proceed")
तो जब पहली अनुरोध रूट किया जाता है यह अनुरोध पैरामीटर में 'आगे बढ़ना' मिला है। फिर जब क्वेरी स्ट्रिंग में 'त्रुटि' param के साथ देखने के लिए कोई त्रुटि और RequestDispatcher आगे की ओर है, तो उसे उपरोक्त "त्रुटि दृश्य" विधि को आगे बढ़ाना चाहिए, लेकिन ऐसा नहीं है। यह हमेशा 'आगे बढ़ने' विधि को आगे बढ़ाता है जिससे MethodInterceptor invoke()
पर अनंत लूप होता है। ऐसा लगता है क्योंकि 'आगे बढ़ना' पैरामीटर अभी भी HttpServletRequest में है। हालांकि यह ठीक करना आसान नहीं है क्योंकि इंटरसेप्टर का पूरा बिंदु यह है कि इसे स्प्रिंग नियंत्रक के बारे में कोई जानकारी नहीं है - यह केवल यह जानता है कि कोई त्रुटि हुई है, और यदि कोई त्रुटि हुई तो उसे त्रुटि दृश्य को आगे बढ़ाना चाहिए।
वर्कअराउंड:
नीचे अनुरोध मैपिंग का उपयोग करना, यह समस्या ठीक होती है। ऐसा इसलिए है क्योंकि कुंजी = मान नोटेशन का उपयोग करते समय HttpServletRequest
पैरामीटर ओवरराइट किया गया है।
त्रुटि दृश्य: @RequestMapping(value = URL, params="view=error")
सामान्य दृश्य: @RequestMapping(value = URL, params="view=proceed")
प्रश्न
मैं कैसे "ठीक से" मुद्दा वैकल्पिक हल ऊपर दिखाए का सहारा के बिना ठीक कर सकते हैं? सही वसंत नियंत्रक को आगे बढ़ाने के लिए एक और मानक तरीका है?
आप MethodInterceptor आह्वान() ** अधिक जानकारी के GitHub या ** द्वारा सभी स्रोत कोड का हिस्सा सकता है? – CrawlingKid