使用 Spring 3 请求映射注释匹配“URL 的其余部分”

2022-09-02 02:42:24

可能的重复:
Spring 3 请求映射:获取路径值

在春季 3 中,有没有办法在以下 URL 中捕获:rest/of/the/url

/myapp/foo/bar/rest/of/the/url

通过使用@RequestMapping注释,如下所示:

@RequestMapping(value="{appname}/{path1}/{path2}/{remainder}")
public String myRequestMethod(
    @PathVariable("appname") String appName, 
    PathVariable("path1") String path1, 
    PathVariable("path2") String path2,
    PathVariable("remainder") String remainder)

我希望 RequestMapping 像这样匹配

{appname}   -> myapp
{path1}     -> foo
{path2}     -> bar
{remainder} -> rest/of/the/url 

Javadocs for RequestMapping 中,有一个关于使用备用正则表达式的说明:

默认情况下,URI 模板将与正则表达式 [^] 匹配。*(即句点以外的任何字符),但这可以通过指定另一个正则表达式来更改,如下所示:/hotels/{hotel:\d+}

但是当我使用请求映射时,这并不像预期的那样(我得到404):如下所示:

@RequestMapping(value="{appname}/{path1}/{path2}/{remainder:.[\\S]*}")

有谁知道如何将URL的其余部分与Spring RequestMapping相匹配?


答案 1

有趣的是:我刚刚发现也需要这样做。以下是我如何解决它:

@RequestMapping(value = {"/someChildUrlIfYouWant/**"}

这里说的是“在我左边的任何子路径上抓住任何东西。如果您希望它实际匹配的路径到达此方法,则可以使用:"**"

request.getAttribute( HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE )

因此,如果您只想要可变子路径,则必须修剪字符串的前部。/someChildUrlIfYouWant/the/full/path/to/whatever.html

有意义?


答案 2

对于上述内容,请尝试:

@RequestMapping(value="{appname}/{path1}/{path2}/{remainder:.+}")

Spring在url中的“.”上停止匹配的默认行为不是很直观。我不认为句号字符在路径的上下文中有任何特殊含义(而不是说“/”,“;”或“?”)。


推荐