2012-07-08 13 views
5

Tôi nhận được ngoại lệ sau đây nếu tôi sử dụng url đa cấp trong lớp như @RequestMapping("/api/v0.1"):lập bản đồ mơ hồ nhận thấy khi sử dụng url @RequestMapping lớp đa mức

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. 

Nó giống như ánh xạ mức độ phương pháp không được vào xem xét ở tất cả.
Nhưng không sao nếu tôi đặt @RequestMapping("/api") tức là xóa phần /v0.1.

Dưới đây là cấu hình tước đến trường hợp tối thiểu:

@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> 

servlet-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/" /> 

Tôi đang sử dụng lò xo 3.1. Tôi cũng đã cố gắng đặt thuộc tính alwaysUseFullPath thành true cho số hạt RequestMappingHandlerMapping nhưng không thay đổi tình hình.

Trả lời

2

Vấn đề rất thú vị - Tôi đã kiểm tra những gì có thể xảy ra, bạn đúng "v0.1" thực sự đang ném ra org.springframework.util.AntPathMatcher tạo đường dẫn URI đầy đủ bằng cách kết hợp đường dẫn từ bộ điều khiển và đường dẫn từ bản đồ phương pháp. Nếu nó thấy một loại "file.extension" của một mẫu trong Controller, thì nó hoàn toàn bỏ qua ánh xạ đường dẫn của phương thức - đây là lý do tại sao @PathVariable của bạn bị bỏ qua.

Tôi không chắc chắn nếu điều này là một lỗi hoặc hành vi dự định trong Spring MVC, sửa chữa tạm thời sẽ cùng những gì bạn đã đề cập -

1.To loại bỏ "v0.1" từ RequestMapping của Controller và làm cho nó mà không cần mở rộng nói v0_1

2.To đưa bản đồ này trong phương pháp ánh xạ: ''

@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

Tôi nhớ đã cố gắng '@RequestMapping ("/api/v01 ")' trên cấp lớp (không có dấu chấm) và không nhận được kết quả nhưng tôi sẽ thử lại và cho bạn biết. cảm ơn. – SelimOber

+1

Ok, tôi đã thử v0_1 và nó hoạt động. Vì vậy, tôi sẽ đi với cái này. – SelimOber

+0

Vì AntPathMatcher cho phép biểu thức chính quy, tôi nghĩ nếu bạn thoát khỏi dấu chấm thì nó sẽ hoạt động. ví dụ. 'v0 \ .1' – jasop

0

Bạn nên sử dụng @RequestMapping(value = "/{version:.*}/users") bao gồm dấu chấm trong biến đường dẫn

Các vấn đề liên quan