2010-04-30 12 views
37

क्या यह अभिव्यक्ति करने का कोई तरीका है कि मेरी स्प्रिंग वेब एमवीसी नियंत्रक विधि को यूआरआई पथ के हिस्से के रूप में आईडी में सौंपने के अनुरोध से मेल खाना चाहिए ...स्प्रिंग वेब एमवीसी: अनुरोध पैरामीटर और पथ चर के लिए उसी अनुरोध मैपिंग का उपयोग करें

@RequestMapping(method=RequestMethod.GET, value="campaigns/{id}") 
public String getCampaignDetails(Model model, @PathVariable("id") Long id) { 

... या ग्राहक में शैली में एक HTTP अनुरोध पैरामीटर के रूप में आईडी भेजता है ...

@RequestMapping(method=RequestMethod.GET, value="campaigns") 
public String getCampaignDetails(Model model, @RequestParam("id") Long id) { 

यह मुझे लगता है एक बहुत आम वास्तविक दुनिया यूआरएल स्कीम जहाँ मैं डुप्लिकेट कोड नहीं जोड़ना चाहते हैं, लेकिन मुझे अभी तक कोई जवाब नहीं मिला। कोई सलाह अत्यधिक स्वागत है।

संपादित करें: यह पता चला है कि वहाँ वर्तमान में लगता है कि कोई रास्ता नहीं इस लक्ष्य को हासिल करने के लिए (वसंत MVC < = 3.0 के साथ), Javi के जवाब के अंदर चर्चा को देखें।

उत्तर

50

आप एक ही फ़ंक्शन के लिए मैपिंग यूआरएल दोनों सेट कर सकते हैं और आईडी को वैकल्पिक के रूप में सेट कर सकते हैं।

@RequestMapping(method=RequestMethod.GET, value={"/campaigns","/campaigns/{id}"}) 
public String getCampaignDetails(Model model, 
    @RequestParam(value="id", required=false) Long id, 
    @PathVariable("id") Long id2) 
{ 
} 

हालांकि यह रूप में अच्छी तरह के नक्शे होगा जब आईडी नहीं भेजी जाती है, लेकिन आप विधि के अंदर इस पर नियंत्रण कर सकते हैं।

संपादित: पिछले समाधान क्योंकि @PathVariablenull पर सेट नहीं है जब वहाँ {null} नहीं है और यह यूआरएल (धन्यवाद ngeek) मैप नहीं कर सकते काम नहीं करता। मुझे लगता है कि एकमात्र संभावित समाधान है कि प्रत्येक @MappingRequest के साथ मैप किए गए दो तरीकों को बनाने के लिए और उनमें से एक के अंदर अन्य फ़ंक्शन को कॉल करें या अन्य यूआरएल (रीडायरेक्ट: या आगे: स्प्रिंग उपसर्ग) पर रीडायरेक्ट करें। मुझे पता है कि यह समाधान वह नहीं है जिसे आप ढूंढ रहे हैं लेकिन लगता है कि यह सबसे अच्छा है जो आप कर सकते हैं। वास्तव में आप कोड डुप्लिकेट नहीं कर रहे हैं लेकिन आप एक और यूआरएल को संभालने के लिए एक और फ़ंक्शन बना रहे हैं।

+1

दुर्भाग्य से यह काम नहीं कर रहा है क्योंकि पथ वैरिएबल हल नहीं किया जा सकता है: path के साथ, आप मानचित्रण इस सवाल से वांछित लक्ष्य को हासिल कर सकते हैं। मैंने विधि पैरामीटर (@PathVariable ("id") लांग id2 में जोड़कर एक संस्करण भी कोशिश की) लेकिन फिर आप पथ चर वैकल्पिक नहीं बना सकते हैं, इसलिए यह प्रस्तावित समाधान काम नहीं करता है। कोई और सिफारिशें? – ngeek

+0

@ngeek मुझे एहसास नहीं हुआ कि @PathVariable को शून्य पर सेट नहीं किया जा सका, धन्यवाद। मैं @PathVariable लिखना भी भूल गया था इसलिए मैंने इसे जोड़ने के लिए अपना जवाब संपादित कर लिया है और मुझे लगता है कि आप 2 तरीकों से बचने से नहीं बच सकते हैं :( – Javi

+1

आपके प्रस्ताव पर वापस आने के लिए धन्यवाद। वास्तव में मैं पहले से ही प्रतिनिधि था डुप्लिकेट कोड से बचने के लिए एक ही आंतरिक विधि। मुझे अभी भी लगता है कि स्प्रिंग एमवीसी एनोटेशन को आंतरिक माध्यम से एक ही विधि में एकाधिक यूआरएल परिभाषाओं को मैप करने का मतलब प्रदान करना चाहिए, जैसे कि रेल या ग्रेल्स में राउटर पहले से ही अनुमति देते हैं। आपकी मदद के लिए धन्यवाद वैसे भी। – ngeek

4

आप अभी भी PathVariable दृष्टिकोण पर कायम करना चाहते हैं और अगर आप 400 वाक्य रचना गलत त्रुटि हो रही है तो यह approach-

@RequestMapping(method=RequestMethod.GET, value={"campaigns/{id}","campaigns"}) 
         public String getCampaignDetails(Model model, 
         @PathVariable Map<String, String> pathVariables) 
    { 

    System.out.println(pathVariables.get("id")); 

    } 
1

@RequestMapping एनोटेशन अब की स्थापना pathname या value के बजाय विशेषता का समर्थन करता है का पालन करें। ,

@RequestMapping(method=RequestMethod.GET, path="campaigns/{id}") 
public String getCampaignDetails(Model model, @PathVariable("id") Long id) { 

@RequestMapping(method=RequestMethod.GET, value="campaigns") 
public String getCampaignDetails(Model model, @RequestParam("id") Long id) { 
संबंधित मुद्दे