2012-07-08 8 views
5

अगर मैं @RequestMapping("/api/v0.1") तरह कक्षा में बहु स्तरीय URL का उपयोग मैं निम्नलिखित अपवाद हो रही है:अस्पष्ट मानचित्रण पाया जब कक्षा बहु स्तर @RequestMapping यूआरएल का उपयोग कर

java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'userController' 
bean method getUsers()|to {[/api/v0.1]}: There is already 'userController' bean 
method getUser(java.lang.String) mapped. 

यह विधि स्तर मैपिंग में नहीं मिलता है की तरह है बिल्कुल विचार करें।
लेकिन यह ठीक है अगर मैंने @RequestMapping("/api") डाल दिया है यानी /v0.1 भाग हटा दें।

@Controller 
@RequestMapping("/api/v0.1") 
public class UserController { 

    @RequestMapping(value = "/users") 
    @ResponseBody 
    public List<User> getUsers() { 
     return null; 
    } 

    @RequestMapping(value = "https://stackoverflow.com/users/{username}") 
    @ResponseBody 
    public User getUser(@PathVariable String username) { 
     return null; 
    } 
} 

web.xml

<servlet-mapping> 
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

सर्वलेट-context.xml: वसंत

<!-- Configures the @Controller programming model --> 
<mvc:annotation-driven /> 

<!-- Forwards requests to the "/" resource to the "welcome" view --> 
<mvc:view-controller path="/" view-name="home"/>  

<!-- Handles HTTP GET requests for /assets/** by efficiently serving up static resources in the ${webappRoot}/resources/ directory --> 
<mvc:resources mapping="/assets/**" location="/assets/" /> 

मैं उपयोग कर रहा हूँ

यहाँ विन्यास कम से कम मामले अप करने के लिए छीन लिया है 3.1। मैंने संपत्ति को RequestMappingHandlerMapping बीन के सत्य पर सेट करने का भी प्रयास किया लेकिन इसने स्थिति को नहीं बदला।

उत्तर

2

बहुत ही रोचक मुद्दा - मैंने जांच की कि क्या हो सकता है, आप सही हैं "v0.1" वास्तव में org.springframework.util.AntPathMatcher को फेंक रहा है जो नियंत्रक से पथ और मैप किए गए पथ को जोड़कर पूर्ण यूआरआई पथ बनाता है तरीका। यदि यह नियंत्रक में एक "file.extension" प्रकार का पैटर्न देखता है, तो यह विधि के पथ मैपिंग को पूरी तरह से अनदेखा करता है - यही वजह है कि आपका @PathVariable अनदेखा हो रहा था।

1.To नियंत्रक के RequestMapping से "v0.1" को हटाने और -

मुझे यकीन है कि अगर यह एक बग या वसंत MVC, अस्थायी ठीक क्या आप पहले से ही उल्लेख किया है साथ होगा में अभिप्रेत व्यवहार है नहीं कर रहा हूँ विस्तार के बिना यह कर कहते हैं कि v0_1

2.To मैप की विधि में इस मानचित्रण डाल: '।'

@Controller 
@RequestMapping("/api") 
public class UserController { 

    @RequestMapping(value = "/v0.1/users") 
    @ResponseBody 
    public List<User> getUsers() { 
     return null; 
    } 

    @RequestMapping(value = "/v0.1/users/{username}") 
    @ResponseBody 
    public User getUser(@PathVariable String username) { 
     return null; 
    } 
} 
+0

मुझे क्लास स्तर (डॉट के बिना) '@RequestMapping ("/ api/v01")' का प्रयास करना याद है और परिणाम नहीं मिल रहा है, लेकिन मैं फिर कोशिश करूँगा और आपको बता दूंगा। धन्यवाद। – SelimOber

+1

ठीक है, मैंने v0_1 कोशिश की और यह काम करता है। तो मैं इस के साथ जा रहा हूँ। – SelimOber

+0

चूंकि AntPathMatcher नियमित अभिव्यक्तियों की अनुमति देता है, मुझे लगता है कि यदि आप डॉट से बच निकले हैं तो यह काम करेगा। जैसे। 'V0 \ .1' – jasop

0

आप @RequestMapping(value = "/{version:.*}/users") का उपयोग करना चाहिए डॉट शामिल करने के लिए पथ परिवर्तनीय

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