82

I am doing a simple 'get' in JBoss/Spring. I want the client to pass me an array of integers in the url. How do I set that up on the server? And show should the client send the message?

This is what I have right now.

@RequestMapping(value="/test/{firstNameIds}", method=RequestMethod.GET)
@ResponseBody
public String test(@PathVariable List<Integer> firstNameIds)
{
     //What do I do??
     return "Dummy"; 
}

On the client I would like to pass something like

http://localhost:8080/public/test/[1,3,4,50]

When I did that I get an error:

java.lang.IllegalStateException: Could not find @PathVariable [firstNameIds] in @RequestMapping

skaffman
  • 398,947
  • 96
  • 818
  • 769
Djokovic
  • 971
  • 2
  • 8
  • 13
  • You might need to use New Spring 3 UI Field Formatting http://static.springsource.org/spring/docs/3.0.0.RC1/reference/html/ch05s06.html – Santosh Gokak Mar 08 '12 at 19:10

5 Answers5

90
GET http://localhost:8080/public/test/1,2,3,4

@RequestMapping(value="/test/{firstNameIds}", method=RequestMethod.GET)
@ResponseBody
public String test(@PathVariable String[] firstNameIds)
{
    // firstNameIds: [1,2,3,4]
    return "Dummy"; 
}

(tested with Spring MVC 4.0.1)

atamanroman
  • 11,607
  • 7
  • 57
  • 81
  • Does jersey support this pattern? – Priyal Oct 01 '17 at 17:02
  • Yes ,Jersey supports this but in different way using PathSegment – MiniSu Apr 09 '18 at 07:00
  • Failed to convert value of type 'java.lang.String' to required type 'java.lang.Long'; nested exception is java.lang.NumberFormatException: For input string: "20056,20056" – 袁文涛 Mar 20 '19 at 10:35
  • But how to distinguish between /{id} and /{ids}? Tried to do it like `@GetMapping(value=["""/{id:\d+}"""])` and `@GetMapping("""/{ids:\d+[,\d+]+}""")` but now Spring tells me that *my-url/123* is ambigous (which isn't the case)... – spyro Feb 01 '21 at 14:52
  • @spyro I guess you could check if `ids.size() == 1`? – atamanroman Feb 11 '21 at 13:57
  • @atamanroman: Thank you, but the desired return type is either a single object or a collection, so I need two distinct methods. – spyro Feb 13 '21 at 16:17
50

You should do something like this:

Call:

GET http://localhost:8080/public/test/1,2,3,4

Your controller:

@RequestMapping(value="/test/{firstNameIds}", method=RequestMethod.GET)
@ResponseBody
public String test(@PathVariable List<Integer> firstNameIds) {
     //Example: pring your params
     for(Integer param : firstNameIds) {
        System.out.println("id: " + param);
     }
     return "Dummy";
}
Idcmp
  • 659
  • 1
  • 8
  • 19
12

if you want to use Square brackets - []

DELETE http://localhost:8080/public/test/[1,2,3,4]

@RequestMapping(value="/test/[{firstNameIds}]", method=RequestMethod.DELETE)
@ResponseBody
public String test(@PathVariable String[] firstNameIds)
{
    // firstNameIds: [1,2,3,4]
    return "Dummy"; 
}

(Tested with Spring MVC 4.1.1)

Jaime
  • 2,148
  • 1
  • 16
  • 19
  • 1
    This works great when wrapping in square brackets, but what if I'm required to send a list wrapped in curly braces? that always seems to blow-up on me... – Schenz Apr 15 '19 at 16:48
3

Could do @PathVariable String ids, then parse the string.

So something like:

@RequestMapping(value="/test/{firstNameIds}", method=RequestMethod.GET)
@ResponseBody
public String test(@PathVariable String firstNameIds)
{
     String[] ids = firstNameIds.split(",");
     return "Dummy"; 
}

You'd pass in:

http://localhost:8080/public/test/1,3,4,50
dardo
  • 4,870
  • 4
  • 35
  • 52
0

At first, put this in your code (Add @PathVariable) :

@GetMapping(path="/test/{firstNameIds}",produces = {"application/json"})
public String test(@PathVariable List<String> firstNameIds)
{
     return "Dummy"; 
}

You'd pass in: http://localhost:8080/public/test/Agent,xxx,yyyy

aminography
  • 21,986
  • 13
  • 70
  • 74