如何映射url RequestMapping中的项目列表

时间:2013-10-30 22:04:28

标签: java regex spring spring-mvc

我正在使用Spring MVC 3.2

我需要这样的东西(伪代码,注意[]):

@RequestMapping("/jpm/[{owners}/{ownersIds}/]{entity}/list")
public ModelAndView doSomething(
        @PathVariable List<String> owners,
        @PathVariable List<String> ownersIds,
        @PathVariable String entity){
   ...
}

我需要一个像这样的网址

/test/1/test2/5/test3/120/something/list

映射到

owners = ["test", "test2", "test3"]
ownersIds = [1,5,120]

/test/1/test2/5/something/list

映射到

owners = ["test", "test2"]
ownersIds = [1,5]

这是否可以使用正则表达式?如何?

更新1:

或者,我可以尝试自己解析所有者列表,但我找不到正确的表达式:

@RequestMapping("/jpm/(1){entity}/list")
public ModelAndView doSomething(
        @PathVariable List<String> owners, (1)
        @PathVariable String entity){
   ...
}

我需要(1)中的某些东西告诉我“任何形式的xx / xx /你喜欢的次数,可选择没有”

这可能吗?

1 个答案:

答案 0 :(得分:2)

我的第一个倾向是告诉你看看Matrix Variables,但我想你可能已经?无论如何,你需要一个不同的模式:

// First an example request:
// GET /jpm/owners;names=bob,jim,john;ids=1,2,3/entityName/list
@RequestMapping("/jpm/owners/{entity}/list")
public ModelAndView doSomething(
    @MatrixVariable Map<String,List<String>> matrixVariables,
    @PathVariable String entity) {
    // matrixVariables now contains a map with values:
    // "names" => ["bob", "jim", "john"]
    // "ids" => ["1", "2", "3"]
    // ...and then obviously the entity variable resolves to "entityName"
}

我直接输入了所有内容,所以我没有测试过。如果我有机会,我会尝试一下并回来并进行适当的编辑。希望无论如何都有帮助。

评论后编辑

我认为矩阵变量的使用是否是“RESTful”是一个值得商榷的问题,这个术语没有官方标准,但是矩阵变量得到了Spring和WADL的支持,所以这给了他们一些支持,我猜。无论如何,我相信Spring根本不支持在@PathVariable中使用“/”,无论你是否使用正则表达式。即使你确实走了那条路,就像你说的那样,你必须解析结果以分割结果列表中的每个项目。相反,为什么不将逗号分隔的列表作为String传递,让Spring为你做解析?

// GET /jpm/owners/bob,jim,john/1,2,3/myEntity/list
@RequestMapping("jpm/owners/{names}/{ids}/{entity}/list")
public String getTest(
    @PathVariable List<String> names, 
    @PathVariable List<String> ids, String entity) {
    // names = ["bob", "jim", "john"]
    // ids = ["1", "2", "3"]
}