2013-05-03 11 views
7

Attualmente sto lavorando su un controller API. Questo controller dovrebbe essere in grado di rilevare qualsiasi parametro - sconosciuto - e inserirlo in un oggetto Map. Ora sto usando questo codice per la cattura di tutti i parametri e metterli in un MapSpring MVC + RequestParam as Map + ottiene parametri dell'array URL non funzionanti

public String processGetRequest(final @RequestParam Map params) 

Ora l'url io chiamo è la seguente:

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

Poi stampare i parametri, a scopo di debug , con questo pezzo di codice:

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

Il risultato di questo è:

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

Ma il risultato atteso dovrebbe essere qualcosa di simile:

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 

o almeno mi dicono che i Card_IDS è un String[]/List<String> e, pertanto, dovrebbero essere colate. Ho anche provato gettando il parametro ad un List<String> manualmente, ma che non funziona neanche:

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)); 
    } 
} 

Qualcuno potrebbe dirmi come ottenere la matrice Card_IDS - Deve essere dinamicamente - dal Map params utilizzando il NameConfiguration.PARAM_NAME_CARDIDS?

risposta

15

Quando si richiede un Map annotato con @RequestParam Spring crea una mappa contenente tutte le coppie nome/valore del parametro di richiesta. Se ci sono due coppie con lo stesso nome, solo una può essere nella mappa. Quindi è essenzialmente un Map<String, String>

È possibile accedere a tutte le parametri attraverso un MultiValueMap:

public String processGetRequest(@RequestParam MultiValueMap parameters) { 

Questa mappa è essenzialmente un Map<String, List<String>>. Quindi i parametri con lo stesso nome sarebbero nella stessa lista.

Problemi correlati