2012-09-28 4 views
6

परिभाषित करने के लिए मैं एक स्थिति है जहाँ मैं निम्नलिखित RequestMapping की जरूरत है। मेरी आशा थी कि वसंत स्वचालित रूप से इसे हल करेगा और दूसरी विधि में /support मानचित्र करेगा, और पहले सब कुछ, लेकिन इसके बजाय पहली विधि में /support मानचित्र करता है।कैसे RequestMapping प्राथमिकता

मैं कैसे बता सकता स्प्रिंग एक स्पष्ट RequestMapping एक ही स्थान पर एक PathVariable के साथ एक RequestMapping ओवरराइड करने के लिए अनुमति देने के लिए?

संपादित करें 2: ऐसा लगता है अगर /support मानचित्रण /{section} मानचित्रण से पहले आया था कि यह काम करेगा। दुर्भाग्यवश हमारे पास दर्जनों नियंत्रक हैं जिनमें RequestMapping के साथ कई विधियां हैं। मैं कैसे सुनिश्चित कर सकता हूं कि /{section} मैपिंग के साथ नियंत्रक आखिरी बार शुरू किया गया है? या एक पूर्व-इंटरसेप्टर जाने का रास्ता होगा?

संपादित करें 1: यह सरल है, मुझे पता है कि उन दो अकेले RequestMapping होने खास मतलब नहीं होता है)

+0

फ़ाइल में ऑर्डर कोई फर्क नहीं पड़ता? – Keppil

+1

@ केपिल वे दो अलग-अलग फाइलों में हैं। –

उत्तर

3

वसंत का उपयोग करके आप org.springframework.web.HttpRequestHandler विस्तार कर सकते हैं अपने परिदृश्य का समर्थन करने के।

विधि को लागू करें:

@Override 
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {} 

, इसका इस्तेमाल भेजे अनुरोध विश्लेषण करने के लिए निर्धारित करता है, तो अनुरोध यूआरएल अनुरोध यूआरएल के अपने विशेष सबसेट का हिस्सा है और उपयुक्त स्थान पर अग्रेषित करें।

पूर्व:

@RequestMapping(value={"/sections/{sectionName}"}) 

यह पहले से मौजूद अपने नियंत्रक मैपिंग से किसी के साथ हस्तक्षेप नहीं करेगा:

@Override 
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
/** You will want to check your array of values and have this data cached **/ 
if (urlPath.contains("/sectionName")) { 
     RequestDispatcher requestDispatcher = request.getRequestDispatcher("sections" + "/" + urlPath); 
     requestDispatcher.forward(request, response); 
    } 

} 

और सेटअप अपने जैसे वर्गों।

+0

बहुत बढ़िया समाधान। रॉक ठोस जवाब, एक बार साइट इसे अनुमति देने के बाद बक्षीस का पुरस्कार देगा। बहुत बहुत धन्यवाद ddubyat !! –

1

2 इन तरीकों 2 अलग नियंत्रकों में परिभाषित कर रहे हैं, तो आपकी समस्या है आप 2 नियंत्रकों है उसी यूआरएल में मैप किया गया। आप अभी नियंत्रक प्रारंभिकरण के क्रम को नियंत्रित नहीं करते हैं, इसलिए ऑर्डर यादृच्छिक है।

मुझे लगता है कि /{section} से पहले आपको /support मानचित्रण की आवश्यकता है।

यह परिभाषित करने के लिए कि नियंत्रक "सेक्शन" नियंत्रक "समर्थन" पर निर्भर करता है। यदि यह दोनों विधियों को एक नियंत्रक के साथ एक साथ रखने की कोशिश नहीं करेगा और "सेक्शन"

से पहले "समर्थन" में मैप किए गए विधि को डालने में मदद नहीं करेगा, तो यह यहां अन्य सुझाव नहीं है। क्या "खंड" है? यदि यह सीमित संख्याओं को स्वीकार कर सकता है तो इसे enum के रूप में परिभाषित किया जाना चाहिए। मेरा मानना ​​है कि इस मामले में सबकुछ आवश्यकतानुसार काम करेगा यदि समर्थन और सेक्शन विधियां एक नियंत्रक में हैं या अलग नियंत्रकों में हैं।

शुभकामनाएं।

+0

प्रतिक्रिया के लिए धन्यवाद, एलेक्स। कई नियंत्रकों पर बिखरे हुए कई "/ x" 'RequestMapping' विधियां हैं। तो हमें प्रारंभिक क्रम के अंत में अनिवार्य रूप से "/ {section}" छड़ी करने की आवश्यकता होगी। क्या उस नियंत्रक या विधि को अंतिम रूप से लोड करने के लिए मजबूर करने का कोई तरीका है? –

0

मैं इस व्यवहार को वसंत 3.1.2 के साथ नहीं देख रहा हूं, यह संभावित रूप से पुराने वसंत संस्करण के साथ एक बग हो सकता है। यहां एक गिस्ट है जो मेरे लिए किसी भी मुद्दे के बिना चलता है - https://gist.github.com/3802254

+0

धन्यवाद, बिजू। आपके दिमाग में, आपके पास पहले 'नमूना' विधि है। क्या आप दो तरीकों के क्रम को फ़्लिप कर सकते हैं और देख सकते हैं कि क्या आपको अभी भी वही परिणाम मिलते हैं? रिवर्स ऑर्डर यह है कि हमारी स्थापना कैसे की जाती है ... –

+0

हां, कोशिश की गई, वसंत 3.1.2 –

+0

के साथ काम करता है, मैं आपको परीक्षण करने की सराहना करता हूं, बिजू। दुर्भाग्य से 3.1.2 को अपडेट करना अभी एक विकल्प नहीं है, लेकिन यह जानकर उत्साहित है कि जब हम अंततः अपडेट करते हैं तो इसे हल किया जा सकता है। –

1

यह एक समस्या नहीं प्रतीत होता है, यह एक वैध मैपिंग है। आप @RequestMapping के साथ खंड 16.3.2 मैपिंग अनुरोध में http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-uri-templates

को एक नजर है, तो ठीक उसी कि आप कोशिश कर रहे हैं कर दो तरीकों से मौजूद है।

यह सुनिश्चित करने के लिए कि आपकी कक्षाएं संकलित की जा रही हैं, कक्षा के स्तर पर @RequestMapping ("/ someprefix") जोड़ने का प्रयास करें ताकि यह देखने के लिए कि यूआरएल आपके जैसा दिख रहा है या नहीं।

मैं संस्करण 3.1.0.RELEASE का उपयोग करके स्थानीय रूप से अपना उदाहरण सत्यापित करता हूं और कोई समस्या मौजूद नहीं थी।

समाधान के लिए (और यह भी प्रदान करने के लिए एक अच्छी तरह से समझते हैं बाकी यूआरआई अपने दूसरे मानचित्रण करने के लिए कुछ संदर्भ जोड़ें:

@RequestMapping(value={"client/support"}) // i.e: if you are working with clients 
public ModelAndView getsupport(@PathVariable Long supportId){ 
    // do your code here something here 
    } 
बेशक

कि इस मान्य है अगर इस प्रणाली में अद्वितीय नियंत्रक मौजूद है, अन्यथा आप श्रेणी स्तर पर RequestMapping का उपयोग करना चाहिए जैसा कि मैंने ऊपर का सुझाव दिया।

मुझे आशा है कि इस मदद करता है।

+0

यह सही जवाब होना चाहिए! –