'Spring - is it possible to give same url (path) in request mapping for two different post methods?

Is it possible to map same path (uri) in request mapping for two different post methods, only difference is request body.

Example

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


Solution 1:[1]

No, you can't give same url in request mapping of post method having different request body type but same media type. Below won't work:

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

If you have different media type, then it will. Below will work:

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

Your RequestMapping should differ on at least one of the conditions; path,method,params,headers,consumes,produces

Solution 2:[2]

I needed the same url post mapping but it was giving me an error so I added different params and it worked for me

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

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

if any of the below is different(as mentioned by the above answers)then you can have the same URL post mapping path,method,params,headers,consumes,produces

In my case params was diffrent

Solution 3:[3]

Yes you can do that but you need to specify unique parameters signature in RequestMapping annotation:

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
}

}

`

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Sukhpal Singh
Solution 2 Sumedh Deshpande
Solution 3 mwdev