2013-12-11 5 views
16

मैं नियंत्रक में एक विधि में आया था। यह आईडी क्या है: + ??स्प्रिंग एमवीसी अनुरोध मानचित्रण हैंडलर विधि में {id:। +} का अर्थ क्या है?

@RequestMapping(value="/index/{endpoint}/{type}/{id:.+}", method=RequestMethod.POST, consumes=kContentType, produces=kProducesType) 
@ResponseBody 
public String indexData(@PathVariable(value="endpoint") String endpoint, @PathVariable(value="type") String type, @PathVariable(value="id") String id, @RequestBody String body, HttpServletRequest request) { 
    logger.debug("In web controller for endpoint " + endpoint); 
    return indexController.indexData(endpoint, type, id, body, getSecurityContextProvider(request)); 
} 

उत्तर

18

एक वसंत MVC नियंत्रक requestmapping में एक पथ चर की वाक्य रचना {variable_name:regular_expression} है। आप वैकल्पिक अभिव्यक्ति को वैकल्पिक रूप से छोड़ सकते हैं, जो आपको अधिक बार देखता है, {id}

तो, उदाहरण के लिए /index/{endpoint}/{type}/{id:.+} परिवर्तनीय नाम id है और नियमित अभिव्यक्ति .+ है (वसंत दस्तावेज़ों के संदर्भ में नीचे देखें)।

नियमित अभिव्यक्ति .+ बता रही है "मेटाएक्टेक्टर . एक या अधिक बार मैच करें"। '।' मेटाएक्टेक्टर सफेद अंतरिक्ष सहित किसी भी चरित्र का प्रतिनिधित्व करता है (हालांकि कुछ कार्यान्वयन न्यूलाइन से मेल नहीं खाते हैं)। देखें http://en.wikipedia.org/wiki/Regular_expression

नियमित अभिव्यक्ति का उपयोग स्प्रिंग को चर के मान को निर्धारित करने में मदद करने के लिए किया जा रहा है क्योंकि आपके पास जटिल चर नाम हो सकते हैं या पथ के अंत में अन्य महत्वपूर्ण जानकारी हो सकती है जो अन्यथा परिवर्तनीय मूल्य में चूस जाती है अगर वसंत ने अभी कहा "पथ के अंत तक जाएं" (उदाहरण के लिए फ़ाइल नाम एक्सटेंशन या पथ चर)।

यह संभव है कि आपके उदाहरण में, आईडी चर में विशेष वर्ण हो सकते हैं जो अन्यथा स्प्रिंग को परिवर्तनीय रूप से चर को समाप्त कर देगा। फ़ाइल एक्सटेंशन (foobar.jpg) वाले फ़ाइल नाम का उपयोग करने का प्रयास करने से पहले मैंने इस समस्या में भाग लिया है। वसंत चर के केवल "foobar" हिस्से को वापस कर देगा क्योंकि वसंत मान रहा था कि मैं चाहता था कि यह अवधि डेलीमीटर पर चर मूल्य को समाप्त कर दे। इसलिए, इस मामले में, यह सुनिश्चित करने के लिए कि "आईडी" पूर्ण मूल्य से मेल खाता है, आप रेगेक्स डालते हैं जो वसंत को आगे बढ़ने के लिए कहता है और अंतिम आगे स्लैश और पथ के अंत के बीच सबकुछ से मेल खाता है। अतः संदर्भ: Spring MVC @PathVariable getting truncated

यहाँ स्प्रिंग डॉक्स से अंश है कि जटिल चर मिलान के साथ संबंधित है:

कभी-कभी आप यूआरआइ टेम्पलेट चर को परिभाषित करने में अधिक सटीक की जरूरत है। यूआरएल "/spring-web/spring-web-3.0.5.jar" पर विचार करें। आप इसे कई हिस्सों में कैसे विभाजित करते हैं?

@RequestMapping एनोटेशन यूआरआई टेम्पलेट चर में नियमित अभिव्यक्तियों के उपयोग का समर्थन करता है। वाक्य रचना {VARNAME: रेगुलर एक्सप्रेशन} है। जहां पहले भाग चर नाम और दूसरे को परिभाषित करता है - नियमित अभिव्यक्ति "

यहाँ उनके (काफी जटिल) उदाहरण है:

@RequestMapping("/spring-web/{symbolicName:[a-z-]+}-{version:\\d\\.\\d\\.\\d}{extension:\\.[a-z]+}") 
public void handle(@PathVariable String version, @PathVariable String extension) { 
    // ... 
} 

स्रोत: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html रेगुलर एक्सप्रेशन का उपयोग किए बिना

उदाहरण वे दिखाता है कि आप अनुरोध से जटिल मैपिंग प्रदर्शन विधि पैरामीटर है कि आप में सक्षम नहीं होगा नियंत्रक को प्रदान करते हैं।

+0

आप एक प्रदान कर सके यूआरएल का उदाहरण जिसका उपयोग इस सेवा को हिट करने के लिए किया जा सकता है? –

+0

"/index/foo/bar/foo.bar" काम करेगा। आईडी पथ वैरिएबल पर "। +" रेगेक्स के बिना, आपको आईडी के लिए केवल "foo" मिल जाएगा, न कि "foo.bar" – reblace

+0

मुझे पूरा यकीन नहीं है कि मैं आपको –

संबंधित मुद्दे