我们遇到两个弹簧控制器碰巧相互干扰的问题。 一个控制器通过通配符前缀匹配URL后缀。另一个控制器匹配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。
不幸的是,这种行为与其他控制器不一样!
如果URL" / some / path / xyz"被称为,Controller3启动。这种行为可以为控制器重现。它总是表现相同,控制器不是随机选择的。
弹簧文档以及其他用户提出的问题指出了这个想法,即"第一个"控制器被采用,匹配给定的模式。但是,这对我来说没有多大意义,因为Controller1和2有一个非常类似的请求映射,但控制器的匹配方式不同!
所有内容都由调度程序servlet处理。
有没有人暗示可能会发生什么?
答案 0 :(得分:5)
这部分我希望从左到右阅读网址,这似乎并非如此。而你是对的,事实并非如此。映射通过特异性解决,相关的文档可用here
URI变量和通配符数量较少的模式是 考虑更具体。例如,
/hotels/{hotel}/*
有1个URI 变量和1张外卡并且被认为更具体/hotels/{hotel}/**
作为1个URI变量和2个通配符。如果两个模式具有相同的计数,则更长的模式是 考虑更具体。例如,
/foo/bar*
更长 被认为比/foo/*
更具体。当两个模式具有相同的计数和长度时,模式具有 更少的外卡被认为更具体。例如
/hotels/{hotel}
比/hotels/*
更具体。
如果两个映射匹配请求,则将应用更具体的映射。根据您的要求制定您的映射以遵循特异性规则