此功能正常
@PostMapping(value="/foo", params={"add"})
public String add(@ModelAttribute Foo foo) {
return "foo";
}
@PostMapping(value="/foo", params={"delete"})
public String delete(@ModelAttribute Foo foo) {
return "foo";
}
为什么这个不起作用?
@PostMapping("/foo")
public String add(@ModelAttribute Foo foo, @RequestParam String add) {
return "foo";
}
@PostMapping("/foo")
public String delete(@ModelAttribute Foo foo, @RequestParam String delete) {
return "foo";
}
通过@PostMapping,我收到以下错误消息。
Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'webController' method
为什么使用 @RequestParam 时会收到ErrorMessage?
答案 0 :(得分:1)
@RequestParam
在使用它的地方分为两个不同的级别。
根据spring文档,参数为
在类型级别和方法级别都受支持!在类型级别使用时,所有方法级别的映射都继承此参数限制(即,甚至在解析处理程序方法之前都会检查类型级别的限制)。
在您的第一种情况下,控制器将两个请求区别开来,因为它们是在类型级别本身上解决的。当您在方法级别使用@RequestParam
时,可以通过将Optional
标志设置为false来选择将参数设置为required
,从而很难分离出端点,因此是错误。
答案 1 :(得分:0)
尝试一下,
@PostMapping("/foo")
public String add(@ModelAttribute Foo foo, @RequestParam("add") String add) {
return "foo";
}
@PostMapping("/foo")
public String delete(@ModelAttribute Foo foo, @RequestParam("delete") String delete){
return "foo";
}
它将起作用。因为您没有指定参数,而只是将字符串用于两个函数。因此,编译器决定两者都是相同的函数,然后才引发模棱两可的错误。