使用@RequestParam时为什么会收到错误消息?

时间:2019-07-16 13:28:55

标签: spring spring-boot spring-mvc

此功能正常

@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?

2 个答案:

答案 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";
}

它将起作用。因为您没有指定参数,而只是将字符串用于两个函数。因此,编译器决定两者都是相同的函数,然后才引发模棱两可的错误。