वसंत: मैं एक अनुरोध-स्कॉप्ड बीन में HttpServletRequest को कैसे इंजेक्ट कर सकता हूं?


95

मैं स्प्रिंग में एक अनुरोधित स्कॉप्ड बीन स्थापित करने की कोशिश कर रहा हूं ।

मैंने सफलतापूर्वक इसे स्थापित कर दिया है इसलिए बीन एक बार अनुरोध के अनुसार बनाया गया है। अब, इसे HttpServletRequest ऑब्जेक्ट तक पहुंचने की आवश्यकता है।

चूंकि बीन अनुरोध के अनुसार एक बार बनाया जाता है, इसलिए मुझे लगता है कि कंटेनर मेरे बीन में अनुरोध ऑब्जेक्ट को आसानी से इंजेक्ट कर सकता है। मैं उसे कैसे कर सकता हूँ ?

जवाबों:


114

अनुरोधित वस्तु के साथ अनुरोधित-स्कोप बीन्स को स्वत: प्राप्त किया जा सकता है।

private @Autowired HttpServletRequest request;

2
क्या इसके लिए कोई पुराने ज़माने का XML तरीका है?
चेरोविम

2
मेरे लिए काम नहीं करता है (वसंत mvc 3.1) - शायद वहाँ कुछ और है जो करने की आवश्यकता है? समित के समाधान के साथ जा रहे हैं।
kldavis4 17

2
समस्या यह है कि जब आप MockMvc का उपयोग करके सत्यापनकर्ताओं का परीक्षण करते हैं और इस तरह के इंजेक्शन से आपको समस्याएं होंगी। हो सकता है कि इस मामले में अन्य समाधान को प्राथमिकता दी जाएगी
नीको

21
HttpServletRequest को गैर-स्कोप्ड बीन्स में भी शामिल करना संभव है, क्योंकि HttpServletRequest स्प्रिंग के लिए एक प्रॉक्सी HttpServletRequest उत्पन्न होगा जो यह जानता है कि अनुरोध का वास्तविक उदाहरण कैसे प्राप्त किया जाए। तो यह सुरक्षित करने के लिए अनुरोध करने के लिए सुरक्षित है, भले ही अपने नियंत्रक एकल scoped है।
vtor

3
स्प्रिंग के लिए चेतावनी <= 3.1 उपयोगकर्ता ऑटोवेयरिंग परीक्षण चलाने का काम नहीं करेंगे।
रुबेन्स मरिज़ो

138

वसंत वर्तमान HttpServletRequestवस्तु (साथ ही वर्तमान HttpSessionवस्तु) को आवरण प्रकार के आवरण के माध्यम से उजागर करता है ServletRequestAttributes। यह आवरण वस्तु थ्रेडलोक से बंधी है और staticविधि को कॉल करके प्राप्त की जाती है RequestContextHolder.currentRequestAttributes()

ServletRequestAttributesgetRequest()वर्तमान अनुरोध प्राप्त करने के लिए विधि प्रदान करता है , getSession()वर्तमान सत्र और अन्य विधियों को दोनों स्कॉप्स में संग्रहीत करने के लिए प्राप्त करता है। निम्नलिखित कोड, हालांकि थोड़ा बदसूरत है, आपको आवेदन में कहीं भी वर्तमान अनुरोध ऑब्जेक्ट मिलना चाहिए:

HttpServletRequest curRequest = 
((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
.getRequest();

ध्यान दें कि RequestContextHolder.currentRequestAttributes()विधि एक इंटरफ़ेस लौटाती है और ServletRequestAttributesउस इंटरफ़ेस को टाइप करने के लिए टाइपकास्ट होने की आवश्यकता होती है ।


स्प्रिंग जेवाडोक: RequestContextHolder | ServletRequestAttributes


8
इंजेक्शन अच्छा रिज़ॉल्यूशन है, लेकिन मुझे MockMvc टेस्टिंग स्प्रिंग वैलिडेटर्स के साथ समस्याएं मिली हैं जो HttpServletRequest को इंजेक्ट करते हैं। इसलिए यदि आप चाहते हैं कि मॉक टेस्ट और प्रोडक्शन कोड दोनों ठीक से चलें तो यह चुनाव होना चाहिए।
14

@Neyko क्यों है? मॉक टेस्ट (यूनिट टेस्ट?) के लिए, आप नकली HttpServletRequest या जो भी आप चाहते हैं, उसे इंजेक्ट कर सकते हैं .. है ना? या आप मेरा अनुमान है कि MockHttpServletRequest का उपयोग कर सकते हैं?
wonhee

क्या एकल-स्कोप सेवा सेवा उदाहरण में उपयोग किया जाना सुरक्षित है?
जिन क्वोन

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.