【问题标题】:Passing an Array or List to @Pathvariable - Spring/Java将数组或列表传递给@Pathvariable - Spring/Java
【发布时间】:2012-03-26 06:23:44
【问题描述】:

我在 JBoss/Spring 中做一个简单的“获取”。我希望客户端在 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:在@RequestMapping 中找不到@PathVariable [firstNameIds]

【问题讨论】:

标签: java spring-mvc path-variables


【解决方案1】:
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 支持这一点,但使用 PathSegment 的方式不同
  • 无法将“java.lang.String”类型的值转换为所需的“java.lang.Long”类型;嵌套异常是 java.lang.NumberFormatException: For input string: "20056,20056"
  • 但是如何区分/{id}和/{ids}呢?尝试像 @GetMapping(value=["""/{id:\d+}"""])@GetMapping("""/{ids:\d+[,\d+]+}""") 那样做,但现在 Spring 告诉我 my-url/123 是模棱两可的(事实并非如此)......
  • @spyro 我想你可以检查一下ids.size() == 1?
【解决方案2】:

你应该这样做:

致电:

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 的答案。
  • 泽西岛是否支持这种模式?
  • 得到 400 错误代码,这个小改动对我有用。 public String test(@PathVariable("firstNameIds") List&lt;Integer&gt; firstNameIds) {
  • 我以 ["first","second"] 的形式发送数据。你能告诉我如何使用 PathVariable 在控制器上接受它吗?
  • @SachinHR : 列表
【解决方案3】:

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

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 测试)

【讨论】:

  • 这在用方括号括起来时效果很好,但是如果我需要发送用花括号括起来的列表怎么办?这似乎总是在我身上爆炸......
【解决方案4】:

可以做@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

【讨论】:

    【解决方案5】:

    首先,把它放在你的代码中(添加@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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      • 2012-08-23
      • 2016-02-23
      相关资源
      最近更新 更多