Spring - 两个不同的post方法能否使用相同的url(路径)在请求映射中?

9

两个不同的POST方法可以映射相同的路径(URI),唯一的区别在于请求正文内容是否相同。

示例

  @RequestMapping(value = "/hello", method = RequestMethod.POST)
  public String helloEmployee(@RequestBody Employee employee) {
    return "Hello Employee";
  }

  @RequestMapping(value = "/hello", method = RequestMethod.POST)
  public String helloStudent(@RequestBody Student student) {
    return "Hello Student";
  }

如果端点和方法相同,您如何知道要调用哪个方法? - Michael Berry
1
可能提供一些背景信息会有所帮助,这似乎是一个 http://xyproblem.info 的问题。 - jonrsharpe
请求体中的参数在每个方法中都不同。 - Ravikumar
这又是同样的上下文。为什么会不同呢?你为什么要将不同的资源发布到同一个端点? - jonrsharpe
3个回答

18
不可以在具有不同请求体类型但相同媒体类型的post方法的请求映射中给出相同的url。以下代码将无法工作:
  @PostMapping(path = "/hello", consumes = MediaType.APPLICATION_JSON_VALUE)
  public String hello(@RequestBody Pojo1 val) {
    return "Hello";
  }

  @PostMapping(path = "/hello", consumes = MediaType.APPLICATION_JSON_VALUE)
  public String hello(@RequestBody Pojo2 val) {
    return "Hello";
  }
如果您有不同的媒体类型,那么它会生效。下面将会起作用:
  @PostMapping(path = "/hello", consumes = MediaType.APPLICATION_JSON_VALUE)
  public String hello(@RequestBody Pojo val) {
    return "Hello";
  }

  @PostMapping(path = "/hello", consumes = MediaType.TEXT_PLAIN_VALUE)
  public String hello(@RequestBody String val) {
    return "Hello";
  }

你的RequestMapping应至少在条件之一上有所区别;路径、方法、参数、头部、消耗、生产


我相信它回答了你的问题。请阅读:当有人回答我的问题时该怎么办? - Sukhpal Singh

5
我需要相同的URL后置映射,但它出现了错误,所以我添加了不同的参数,这样对我有效。
//url1 post mapping
@PostMapping(value = "/applicant/{step}", params = "validatedata")

//url2 post mapping
@PostMapping(value = "/applicant/{step}", params = "data")

如果上述答案中任何一项不同,则可以使用相同的URL后缀映射。 路径、方法、参数、头信息、请求类型、响应类型 在我的情况下,参数是不同的。

请问您能否引用此声明的来源 - 如果以下任何内容与上述答案不同,则可以使用相同的URL后置映射路径、方法、参数、标头、消耗和生成。我有不同的方法名称,但仍然认为Spring会导致冲突并抛出错误。因此想从某个来源进行验证。 - Swapnil Jaju

1

是的,你可以这样做,但你需要在RequestMapping注解中指定唯一的参数签名:

public class MyController {

@RequestMapping(method = RequestMethod.POST, params = {"!name", "!name2"})
public String action(HttpServletRequest request, HttpServletResponse response){
    // body
}

@RequestMapping(method = RequestMethod.POST, params = "name")
public String action(HttpServletRequest request, HttpServletResponse response,
                        @RequestParam(value = "name", required = true) String name) {
    // body
}

}

`


1
谢谢,但是值是通过参数在post中传递的..我想避免这种情况.. - Ravikumar
1
it's the only way - mwdev
你为什么收回了对我的答案的接受?;] 它是这里最接近的,精确地指出了你所问的参数部分。 - mwdev
你的解决方案最适合基于参数的POST请求。 - Ravikumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接