匹配 Spring RequestMapping 中的任何内容
Matching anything in Spring RequestMapping
在 Spring MVC 休息服务上,我在尝试匹配超出我配置的 RequestMapping 值的任何内容时遇到问题。
例如我有这个:
@RequestMapping(value = "{configKey}/{arguments:.*}", method = RequestMethod.GET)
这表示匹配第二个路径变量之外的任何内容。问题是这例如适用于:
get("/test/document")
虽然这以 404 结尾:
get("/test/document/download")
很奇怪 Spring 不能处理这个正则表达式。我实际上尝试了很多解决方案,但其中 none 有效。
之前我在 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:.*}")
以下映射应该适合您
@RequestMapping(value = "{configKey}/**", method = RequestMethod.GET)
此映射称为 default mapping pattern。
Spring 使用 AntPathMatcher,映射使用以下规则匹配 URL:
1. ? matches one character
2. * matches zero or more characters
3. ** matches zero or more 'directories' in a path
这就是我配置请求映射的方式 url,我已经在我的计算机上进行了测试,它可以正常工作,您可以根据需要进行自定义。
@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
我找到了一个解决方法,它不是永久解决方案,我认为这是 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 on 例如此路径:
get("/test/leaderboard/user/mq/frankie1")
我有:
configKey = test
arguments = leaderboard/user/mq/frankie1
在 Spring MVC 休息服务上,我在尝试匹配超出我配置的 RequestMapping 值的任何内容时遇到问题。
例如我有这个:
@RequestMapping(value = "{configKey}/{arguments:.*}", method = RequestMethod.GET)
这表示匹配第二个路径变量之外的任何内容。问题是这例如适用于:
get("/test/document")
虽然这以 404 结尾:
get("/test/document/download")
很奇怪 Spring 不能处理这个正则表达式。我实际上尝试了很多解决方案,但其中 none 有效。
之前我在 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:.*}")
以下映射应该适合您
@RequestMapping(value = "{configKey}/**", method = RequestMethod.GET)
此映射称为 default mapping pattern。
Spring 使用 AntPathMatcher,映射使用以下规则匹配 URL:
1. ? matches one character
2. * matches zero or more characters
3. ** matches zero or more 'directories' in a path
这就是我配置请求映射的方式 url,我已经在我的计算机上进行了测试,它可以正常工作,您可以根据需要进行自定义。
@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
我找到了一个解决方法,它不是永久解决方案,我认为这是 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 on 例如此路径:
get("/test/leaderboard/user/mq/frankie1")
我有:
configKey = test
arguments = leaderboard/user/mq/frankie1