【问题标题】:Matching anything in Spring RequestMapping匹配 Spring RequestMapping 中的任何内容
【发布时间】:2015-02-20 15:41:25
【问题描述】:

在 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:.*}")

【问题讨论】:

  • 您期望有多少个参数?你知道确切的数字吗?
  • 不,这就是重点,它是动态的,可以是任意数量的参数。
  • 你能不能试着把它改成@RequestMapping(value = "{configKey}/**", method = RequestMethod.GET)?
  • 对不起帕特里克,如果我及时看到你的评论不会回答,我们甚至可以交换,你回答,我删除:)
  • 我已经编辑了我的问题,请看一下。

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


【解决方案1】:

以下映射应该适合您

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

此映射称为default mapping pattern

【讨论】:

  • 这不起作用,正如我提到的,它不会将 {configKey} 之外的其余部分绑定到 {arguments} 路径变量。
【解决方案2】:

我找到了一个解决方法,它不是永久的解决方案,我认为这是 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

【讨论】:

  • 此 jira 标记为“按设计工作”,“@RequestMapping 模式中的路径变量不能跨越多个路径段。”。所以我认为我们不能解决这个问题,而是使用查询参数来代替。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-21
    • 2020-05-04
    • 2011-01-21
    • 2016-08-17
    • 1970-01-01
    • 2020-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多