gpt4 book ai didi

java - 匹配到相同 URL 的两个 Spring Controller 导致错误的 Controller 调用

转载 作者:行者123 更新时间:2023-11-29 07:41:37 26 4
gpt4 key购买 nike

我们遇到了两个 Spring Controller 碰巧相互干扰的问题。一个 Controller 通过 URL 后缀的通配符前缀进行匹配。另一个 Controller 匹配 URL 前缀。我希望从左到右读取 URL,但事实并非如此。

考虑以下代码(已编辑):

    @RequestMapping(value = "/**/abcdefg")
public class Controller1 {...}

@RequestMapping(value = "/**/xyz")
public class Controller2 {...}

@RequestMapping(value = "/some/{path}")
public class Controller3
{
@RequestMapping(value = "/{page}", method = RequestMethod.GET)
public String page(@PathVariable("page") final String page, final Model model)
{ //do sth }
}

现在的问题是,如果调用 URL“/some/path/abcdefg”,Controller1 就会启动。但我想要 Controller3。

不幸的是,这种行为与其他 Controller 不同!

如果调用 URL“/some/path/xyz”,Controller3 将启动。此行为对于 Controller 是可重现的。它的行为始终相同,并且 Controller 不是随机选择的。

spring 文档以及其他用户提出的问题都指出了这样的想法,即采用与给定模式匹配的“第一个” Controller 。但是,这对我来说意义不大,因为 Controller1 和 2 具有非常相似的请求映射,但 Controller 匹配不同!

一切都由调度程序 servlet 处理。

有没有人暗示可能会发生什么?

最佳答案

这部分 我希望从左到右读取 URL,但事实并非如此。 你是对的,事实并非如此。映射按特异性解析,相关文档可用here

A pattern with a lower count of URI variables and wild cards is considered more specific. For example /hotels/{hotel}/* has 1 URI variable and 1 wild card and is considered more specific than /hotels/{hotel}/** which as 1 URI variable and 2 wild cards.

If two patterns have the same count, the one that is longer is considered more specific. For example /foo/bar* is longer and considered more specific than /foo/*.

When two patterns have the same count and length, the pattern with fewer wild cards is considered more specific. For example /hotels/{hotel} is more specific than /hotels/*.

如果两个映射匹配一个请求,将应用更具体的。根据您的要求制定您的映射以遵循特定规则

关于java - 匹配到相同 URL 的两个 Spring Controller 导致错误的 Controller 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29541380/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com