在Spring MVC中如何将URL的多个段映射到一个PathVariable?

3

我正在开发一个Web应用程序,其中一个功能是列出给定路径下的所有文件。我尝试将URL的几个段映射到一个PathVariable上,类似于这样:

@RequestMapping("/list/{path}")
public String listFilesUnderPath(@PathVariable String path, Model model) {
     //.... add the file list to the model
     return "list"; //the model name
}

没成功。当请求url为 /list/folder_a/folder_aa 时,RequestMappingHandlerMapping 报错:"Did not find handler method for ..."

由于给定路径可能包含任意数量的段落,因此为每种情况编写方法是不切实际的。

2个回答

4
在REST中,每个URL都是一个独立的资源,因此我认为您无法拥有通用解决方案。我可以想到两个选项:
1. 一种选择是将映射更改为@RequestMapping("/list/**")(不再需要path参数),并从请求中提取整个路径。 2. 第二个选项是创建多个方法,使用像@RequestMapping("/list/{level1}")@RequestMapping("/list/{level1}/{level2}")@RequestMapping("/list/{level1}/{level2}/{level3}")等映射,连接方法体中的路径并调用执行任务的一个方法。当然,这样做的缺点是您只能支持有限的文件夹深度(如果对您来说不太丑陋,您可以使用这些映射制作数十个方法)。

0

将星号附加到路径模式末尾,可以捕获零个或多个路径段。

Spring文档中关于PathPattern:

{*spring}匹配路径中的零个或多个路径段直到路径的末尾,并将其作为名为"spring"的变量进行捕获。

请注意,在同一页示例中提到的内容中,前导斜杠是捕获路径的一部分:

/resources/{*path} — 匹配/resources/下的所有文件,以及/resources本身,并捕获它们的相对路径到名为"path"的变量中;/resources/image.png将与"path" → "/image.png"匹配,/resources/css/spring.css将与"path" → "/css/spring.css"匹配。

对于您的特定问题,解决方案如下:

@RequestMapping("/list/{*path}") // Use *path instead of path
public String listFilesUnderPath(@PathVariable String path, Model model) {
     //.... add the file list to the model
     return "list"; //the model name
}

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