使用@RequestParam时出错,但用作Java/Spring参数时出错

使用@RequestParam时出错,但用作Java/Spring参数时出错,spring,spring-boot,spring-mvc,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"; } 为什么这个不起作用? @PostMapp

这起作用了

@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时会收到错误消息

@RequestParam
在您使用它的两个不同级别上解析

根据spring文档,参数为

在类型级别和方法级别都受支持!在类型级别使用时,所有方法级别映射都继承此参数限制(即,在解析处理程序方法之前检查类型级别限制)

在第一种情况下,控制器区分两个不同的请求,因为它是在类型级别本身解析的。当您在方法级别使用
@RequestParam
时,您可以通过将
required
标志设置为false,将参数设置为
可选
,这样很难区分端点,因此会出现错误。

尝试此选项

@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";
}

它会起作用的。因为您没有指定参数,只是使用字符串来表示两个函数。因此,编译器决定这两个函数是相同的,然后只抛出不明确的错误。

是。只需为每个
@PostMapping
指定相同的params属性,即
params={“…”}
。要调用的处理程序将完全通过其映射来解析,而不是通过引用任何方法args来解析。PostMapping是一个简单的RequestMapping,它使用POST as方法。这是因为两个方法不能有相同的
@PostMapping(“/foo”)
映射。Java方法名称在这里不起任何作用。请阅读文档以了解如何正确地将请求映射到控制器:您可以将delete方法的
@PostMapping
更改为
@DeleteMapping
@philijack,我的解决方案有帮助吗?