2013-05-03 9 views
7

Tôi hiện đang làm việc trên bộ điều khiển API. Bộ điều khiển này có thể bắt bất kỳ số nào - không rõ - tham số và đặt nó trong đối tượng Map. Bây giờ tôi đang sử dụng mã này để bắt tất cả các thông số và đặt chúng trong một MapSpring MVC + RequestParam dưới dạng Bản đồ + lấy tham số mảng URL không hoạt động

public String processGetRequest(final @RequestParam Map params) 

Bây giờ url tôi gọi là như sau:

server/api.json?action=doSaveDeck&Card_IDS[]=1&Card_IDS[]=2&Card_IDS[]=3 

Sau đó, tôi in ra các thông số, cho mục đích gỡ lỗi , với đoạn mã này:

if (logger.isDebugEnabled()) { 
    for (Object objKey : params.keySet()) { 
     logger.debug(objKey.toString() + ": " + params.get(objKey)); 
    } 
} 

kết quả của việc đó là:

10:43:01,224 DEBUG ApiRequests:79 - action: doSaveDeck 
10:43:01,226 DEBUG ApiRequests:79 - Card_IDS[]: 1 

Nhưng kết quả mong đợi nên một cái gì đó như:

10:43:XX DEBUG ApiRequests:79 - action: doSaveDeck 
10:43:XX DEBUG ApiRequests:79 - Card_IDS[]: 1 
10:43:XX DEBUG ApiRequests:79 - Card_IDS[]: 2 
10:43:XX DEBUG ApiRequests:79 - Card_IDS[]: 3 

Hoặc ít nhất cho tôi biết rằng Card_IDS là một String[]/List<String> và do đó cần được đúc. Tôi cũng đã cố gắng đúc các tham số để một List<String> bằng tay nhưng điều đó không làm việc, hoặc:

for (Object objKey : params.keySet()) { 
    if(objKey.equals(NameConfiguration.PARAM_NAME_CARDIDS)){ //Never reaches this part 
     List<String> ids = (List<String>)params.get(objKey); 

     for(String id : ids){ 
      logger.debug("Card: " + id); 
     } 
    } else { 
     logger.debug(objKey + ": " + params.get(objKey)); 
    } 
} 

Có thể ai đó cho tôi biết làm thế nào để có được mảng Card_IDS - Nó phải là động - từ Map params bằng NameConfiguration.PARAM_NAME_CARDIDS?

Trả lời

15

Khi bạn yêu cầu Map chú thích với @RequestParam Spring tạo bản đồ chứa tất cả cặp tên/giá trị thông số yêu cầu. Nếu có hai cặp có cùng tên, thì chỉ có một cặp có thể có trong bản đồ. Vì vậy, nó thực chất là Map<String, String>

Bạn có thể truy cập vào tất cả các thông số thông qua một MultiValueMap:

public String processGetRequest(@RequestParam MultiValueMap parameters) { 

Bản đồ này về cơ bản là một Map<String, List<String>>. Vì vậy, các tham số có cùng tên sẽ nằm trong cùng một danh sách.