使用Spring 3 RequestMapping Annotation匹配“其余URL”

时间:2010-12-27 23:07:57

标签: java spring-mvc

  

可能重复:
  Spring 3 RequestMapping: Get path value

在Spring 3中,有没有办法在以下网址中捕获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 

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

  

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

但当我像这样使用RequestMapping时,这不会像预期的那样(我得到404):

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

有没有人知道如何将其余的URL与Spring RequestMapping相匹配?

2 个答案:

答案 0 :(得分:39)

有趣的是:我也遇到了这样做的需要。这就是我解决它的方法:

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

这里的"**"说“在我左边的任何子路径上抓住任何东西。”如果你想要实际匹配的路径来获得这个方法,你可以使用:

request.getAttribute( HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE )

您将获得/someChildUrlIfYouWant/the/full/path/to/whatever.html所以如果您只想要变量子路径,则必须修剪字符串的前部。

有意义吗?

答案 1 :(得分:6)

对于上述尝试:

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

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