匹配Spring RequestMapping中的任何内容

时间:2015-02-20 15:41:25

标签: java spring rest spring-mvc request-mapping

在Spring MVC休息服务上,我在尝试匹配超出配置的RequestMapping值的任何内容时遇到问题。

因此,例如我有这个:

@RequestMapping(value = "{configKey}/{arguments:.*}", method = RequestMethod.GET)

其中表示匹配超出第二个路径变量的任何内容。问题在于,例如适用于:

get("/test/document")

虽然最终得到404:

get("/test/document/download")

Spring无法处理这个正则表达式,这很奇怪。我实际上尝试了很多解决方案,但没有一个能够解决问题。

以前我在JAX-RS上有这个配置:

@Path("/{configKey}/{arguments:.*}")

一切都很好,但现在我正在迁移并遇到这个问题。

有谁知道发生了什么以及如何解决这个问题?

修改

添加{configKey}/** - 无效

添加{configKey}/{arguments}/**有效,但对于如果我打电话:

get("/test/document/download")我只获得test作为配置密钥,document作为参数。在论证中,我期望得到超越{configKey}的所有内容。哪个可以是任何东西,例如它应该适用于任何情况:

get("/test/document")
get("/test/document/download")
get("/test/document/download/1")
get("/test/document/download/1/2")
get("/test/whatever/xxx/1/2/etc")

使用配置JAX-RS:@Path("/{configKey}/{arguments:.*}")

3 个答案:

答案 0 :(得分:1)

以下映射应该适合您

@RequestMapping(value = "{configKey}/**", method = RequestMethod.GET)

此映射称为default mapping pattern

答案 1 :(得分:0)

我找到了一个解决方法,它不是永久的解决方案,我认为这是Spring中的一个错误,我提出了Jira,但直到它修复到这里:

我必须像这样定义我的请求映射:

@RequestMapping(value = "{configKey}/**", method = RequestMethod.GET)

所以基本上匹配路径中第一个变量之后的所有内容。

然后:

String arguments = pathMatcher.extractPathWithinPattern(
        request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE).toString(),
        request.getPathInfo());

其中pathMatcher是Spring使用的AntPathMatcher的实例。

所以现在调用HTTP GET,例如这条道路:

get("/test/leaderboard/user/mq/frankie1")

我有:

configKey = test
arguments = leaderboard/user/mq/frankie1

答案 2 :(得分:-1)

Spring使用AntPathMatcher,映射使用以下规则匹配URL:

1. ? matches one character
2. * matches zero or more characters
3. ** matches zero or more 'directories' in a path

这是我配置请求映射网址的方式,我在我的计算机上进行了测试,并且它可以正常工作,您可以根据自己的需要进行自定义。

@RequestMapping(value = "/new-ajax/**", method = RequestMethod.GET)

测试用例

/new-ajax/document/1
/new-ajax/document/download/1
/new-ajax/document/download/1/2
/new-ajax/test/whatever/xxx/1/2/etc