ChatGPT解决这个技术问题 Extra ChatGPT

Passing an Array or List to @Pathvariable - Spring/Java

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

You might need to use New Spring 3 UI Field Formatting static.springsource.org/spring/docs/3.0.0.RC1/reference/html/…

a
atamanroman
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)


Does jersey support this pattern?
Yes ,Jersey supports this but in different way using PathSegment
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"
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 I guess you could check if ids.size() == 1?
I
Idcmp

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

Confirmed the above works with Spring 4.2, likely with most of Spring 4.x. This is also the most Java-like answer offered.
Does Jersey support this pattern?
got 400 error code, this small change worked for me. public String test(@PathVariable("firstNameIds") List<Integer> firstNameIds) {
I am sending data as ["first","second"].Can you tell how to accept it at controller using PathVariable?
@SachinHR : List
J
Jaime

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)


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...
d
dardo

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

a
aminography

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