如何在spring-mvc 中将多个URL 段映射到一个PathVariable?
How to map several segments of URL to one PathVariable in spring-mvc?
我正在开发一个网络应用程序,其功能之一是列出给定路径下的所有文件。我试图将 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 ..."
由于给定的路径可以包含任意数量的段,因此为每种可能的情况编写一个方法是不切实际的。
在 REST 中,每个 URL 都是一个单独的资源,所以我不认为你可以有一个通用的解决方案。我可以想到两个选择
- 一个选项是将映射更改为
@RequestMapping("/list/**")
(不再需要 path
参数)并从请求 中提取整个路径
- 第二个选项是创建多个方法,使用
@RequestMapping("/list/{level1}")
、@RequestMapping("/list/{level1}/{level2}")
、@RequestMapping("/list/{level1}/{level2}/{level3}")
等映射...连接方法主体中的路径并调用一个完成该工作的方法.当然,这有一个缺点,即您只能支持有限的文件夹深度(如果对您来说不太丑的话,您可以使用这些映射创建十几种方法)
您可以通过将星号附加到路径模式来捕获零个或多个路径段。
来自Spring documentation on PathPattern
:
{*spring}
matches zero or more path segments until the end of the path and captures it as a variable named "spring"
请注意,前导斜杠是同一页示例中提到的捕获路径的一部分:
/resources/{*path}
— matches all files underneath the /resources/
, as well as /resources
, and captures their relative path in a variable named "path"; /resources/image.png
will match with "path" → "/image.png", and /resources/css/spring.css
will match with "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
}
我正在开发一个网络应用程序,其功能之一是列出给定路径下的所有文件。我试图将 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 ..."
由于给定的路径可以包含任意数量的段,因此为每种可能的情况编写一个方法是不切实际的。
在 REST 中,每个 URL 都是一个单独的资源,所以我不认为你可以有一个通用的解决方案。我可以想到两个选择
- 一个选项是将映射更改为
@RequestMapping("/list/**")
(不再需要path
参数)并从请求 中提取整个路径
- 第二个选项是创建多个方法,使用
@RequestMapping("/list/{level1}")
、@RequestMapping("/list/{level1}/{level2}")
、@RequestMapping("/list/{level1}/{level2}/{level3}")
等映射...连接方法主体中的路径并调用一个完成该工作的方法.当然,这有一个缺点,即您只能支持有限的文件夹深度(如果对您来说不太丑的话,您可以使用这些映射创建十几种方法)
您可以通过将星号附加到路径模式来捕获零个或多个路径段。
来自Spring documentation on PathPattern
:
{*spring}
matches zero or more path segments until the end of the path and captures it as a variable named "spring"
请注意,前导斜杠是同一页示例中提到的捕获路径的一部分:
/resources/{*path}
— matches all files underneath the/resources/
, as well as/resources
, and captures their relative path in a variable named "path";/resources/image.png
will match with "path" → "/image.png", and/resources/css/spring.css
will match with "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
}