Can Spring MVC handle multivalue query parameter?

Spring Mvc

Spring Mvc Problem Overview


Having this http://myserver/find-by-phones?phone=123&phone=345 request, is it possible to handle with something like this:

@Controller
public class Controller{
    @RequestMapping("/find-by-phones")
    public String find(List<String> phones){
       ...
    }
}

Can Spring MVC some how convert multi-value param phones to a list of Strings (or other objects?

Thanks.

Alex

Spring Mvc Solutions


Solution 1 - Spring Mvc

"Arrays" in @RequestParam are used for binding several parameters of the same name:

phone=val1&phone=val2&phone=val3

-

public String method(@RequestParam(value="phone") String[] phoneArray){
    ....
}

You can then convert it into a list using Arrays.asList(..) method

EDIT1:

As suggested by emdadul, latest version of spring can do like below as well:

public String method(@RequestParam(value="phone", required=false) List<String> phones){
    ....
}

Solution 2 - Spring Mvc

Spring can convert the query param directly into a List or even a Set

for example:

 @RequestParam(value = "phone", required = false) List<String> phones

or

 @RequestParam(value = "phone", required = false) Set<String> phones

Solution 3 - Spring Mvc

I had an issue with indexed querystring like

http://myserver/find-by-phones?phone[0]=123&phone[1]=345
and only handling with
MultiValueMap<String, String>
worked for me. Neither List or String[] were handling it properly.

I also tried

@RequestParam("phones[]")
but RequestParamMethodArgumentResolver is looking explicitly for phones[] ignoring indexes. So that is why I decided to let RequestParamMapMethodArgumentResolver handle it.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAlexVView Question on Stackoverflow
Solution 1 - Spring MvcfmucarView Answer on Stackoverflow
Solution 2 - Spring MvcMarquis BlountView Answer on Stackoverflow
Solution 3 - Spring MvcmlecarView Answer on Stackoverflow