将数组或列表传递给@Pathvariable - Spring/Java

82

我正在使用JBoss/Spring进行简单的“get”操作。 我希望客户端在url中传递一个整数数组。 如何在服务器上设置它?应该如何发送消息?

这是我现在拥有的。

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

我想在客户端传递类似于以下内容:

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

但是我这样做的时候出现了错误:

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


你可能需要使用新的Spring 3 UI字段格式化。http://static.springsource.org/spring/docs/3.0.0.RC1/reference/html/ch05s06.html - Santosh Gokak
5个回答

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

(在Spring MVC 4.0.1下测试通过)


Jersey支持这个模式吗? - Priyal
是的,Jersey支持这一点,但使用PathSegment的方式略有不同。 - MiniSu
转换类型失败:无法将类型为'java.lang.String'的值转换为所需类型'java.lang.Long';嵌套异常是java.lang.NumberFormatException:输入字符串格式错误:"20056,20056" - 袁文涛
但是如何区分 /{id} 和 /{ids}?尝试像这样做 @GetMapping(value=["""/{id:\d+}"""])@GetMapping("""/{ids:\d+[,\d+]+}"""),但现在Spring告诉我 my-url/123 是模糊的(实际上并不是...) - spyro
@spyro 我猜你可以检查 ids.size() == 1 是否成立? - atamanroman
@atamanroman:谢谢,但期望的返回类型是单个对象或集合,因此我需要两种不同的方法。 - spyro

52

你应该这样做:

调用:

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

你的控制器:

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

确认以上内容适用于Spring 4.2,并且很可能适用于大多数Spring 4.x版本。这也是提供的最符合Java风格的答案。 - Idcmp
Jersey支持这种模式吗? - Priyal
收到了400错误代码,这个小改动对我有用。public String test(@PathVariable("firstNameIds") List<Integer> firstNameIds) { - Sushil
1
我正在发送数据,格式为["first","second"]。您能告诉我如何在控制器中使用PathVariable接受它吗? - Sachin HR
@SachinHR:List<String> - Onic Team

12

如果你想使用方括号 - []

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

(使用Spring MVC 4.1.1进行测试)


1
这在方括号中包装时非常有效,但如果我需要发送用花括号包装的列表怎么办?那总是会让我遇到问题... - Schenz

3

可以使用@PathVariable String ids,然后解析字符串。

具体来说:

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

您需要传入以下内容:

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

0

首先,在您的代码中添加以下内容(添加@PathVariable):

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

你需要传入: http://localhost:8080/public/test/Agent,xxx,yyyy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接