使用Spring 3的RequestMapping注解匹配“URL的其余部分”

22
在Spring 3中,是否有一种方法可以捕获以下URL中的rest/of/the/url部分:
Spring 3 RequestMapping: Get path value
/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 

在RequestMapping的Javadocs中,有一条关于使用替代正则表达式的注释:
默认情况下,URI模板将与正则表达式[^.]*(即除句号以外的任何字符)匹配,但可以通过指定另一个正则表达式来更改此行为,例如:/hotels/{hotel:\d+}
但是当我使用以下方式的RequestMapping时,它并不按预期工作(我得到404错误)。
@RequestMapping(value="{appname}/{path1}/{path2}/{remainder:.[\\S]*}")

有人知道如何使用Spring RequestMapping匹配URL的其余部分吗?


你说得完全正确。这是一个重复的问题。 - David Krisch
5
可以,但我更喜欢这个问题的措辞。 - Bozho
2个回答

47

有趣的事情:我也刚好遇到了这个需求。以下是我解决它的方法:

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

"**" 表示抓取左侧任何子路径的任何内容。如果您想获取实际匹配到该方法的路径,可以使用:

"**"在此表示“获取我左侧任何子路径中的任何内容”。如果您想要获得实际匹配到此方法的路径,可以使用:

request.getAttribute( HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE )
你将获得/someChildUrlIfYouWant/the/full/path/to/whatever.html,因此如果你只想要变量的子路径,你需要截掉字符串的前一部分。
明白了吗?

1
我也做了同样的事情,可惜没有更好的选择,因为如果你改变端点的名称,它就不再起作用了。 - Luc DUZAN

8

对于上述尝试:

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

Spring的默认行为是在URL中停止匹配'.',这不太直观。我认为句点字符在路径上下文中没有任何特殊含义(与'/'、';'或'?'不同)。


1
嘿,这非常接近我想要的,但它并不像我期望的那样工作。如果我请求url someappname/apath/anotherpath/whatever.file我将能够检索剩余的路径变量为 whatever.file然而,如果我请求 someappname/apath/anotherpath/and/an/other/path/whatever.file你提供的模式(.+)将无法匹配,当我本以为我会得到值 and/an/other/path/whatever.file您或其他阅读此内容的人能否建议我应该使用哪种模式来获取url剩余部分? - VLostBoy
@RequestMapping("{appname}/{path1}/{path2}/{remainder:.*}") - dgeske
@dgeske 它不起作用。 - uthark
你应该使用 https://dev59.com/22855IYBdhLWcg3wGQJM#11248730。那个有效。 - vinnybad
1
只有在余数不包含任何斜杠的情况下,这才对我起作用。 - BillMan

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