By mikezang


2016-02-02 14:19:28 8 Comments

I tried to use some code as below:

@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public Brand getBrand(@PathVariable Integer id) {
    return brandService.getOne(id);
}

@RequestMapping(value = "/{name}", method = RequestMethod.GET)
public List<Brand> getBrand(@PathVariable String name) {
    return brandService.getSome(name);
}

But I got error like this, how can I do?

java.lang.IllegalStateException: Ambiguous handler methods mapped for HTTP path 'http://localhost:8080/api/brand/1': {public java.util.List com.zangland.controller.BrandController.getBrand(java.lang.String), public com.zangland.entity.Brand com.zangland.controller.BrandController.getBrand(java.lang.Integer)}
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:375) ~[spring-webmvc-4.2.4.RELEASE.jar:4.2.4.RELEASE]

2 comments

@sandeep srivastav vaddiparthy 2019-03-23 06:39:12

@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public Brand getBrand(@PathVariable Integer id) {
    return brandService.getOne(id);
}

@RequestMapping(value = "/{name}", method = RequestMethod.GET)
public List<Brand> getBrand(@PathVariable String name) {
    return brandService.getSome(name);
}

When you run the app, and access the endpoints you tried coding up you realize the following, 'http://localhost:8086/brand/1' and 'http://localhost:8086/brand/FooBar' correspond to the same URL format (which can be described as protocol+endpoint+'brand'+). So SpringBoot is essentially confused if it should call the function 'getBrand' with a String datatype or an Integer. So to get over this I'd suggest you use a query parameter as mentioned by @cassiomolin or have separate paths for both invocations. This may be against the REST principles but assuming you are just doing a sample app this is another workaround.

@RequestMapping(value = "/id/{id}", method = RequestMethod.GET)
public Brand getBrand(@PathVariable Integer id) {
    return brandService.getOne(id);
}

@RequestMapping(value = "/name/{name}", method = RequestMethod.GET)
public List<Brand> getBrand(@PathVariable String name) {
    return brandService.getSome(name);
}

This worked for me.

@cassiomolin 2016-02-02 15:41:11

Spring can't distinguish if the request GET http://localhost:8080/api/brand/1 will be handled by getBrand(Integer) or by getBrand(String) because your mapping is ambiguous.

Try using a query parameter for the getBrand(String) method. It seems more appropriate, since you are performing a query:

@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public Brand getBrand(@PathVariable Integer id) {
    return brandService.getOne(id);
}

@RequestMapping(method = RequestMethod.GET)
public List<Brand> getBrand(@RequestParam(value="name") String name) {
    return brandService.getSome(name);
}

Using the approach described above:

  • Requests like GET http://localhost:8080/api/brand/1 will be handled by getBrand(Integer).
  • Requests like GET http://localhost:8080/api/brand?name=nike will be handled by getBrand(String).

Just a hint

As a good practice, always use plural nouns for your resources. Instead of /brand, use /brands.

Related Questions

Sponsored Content

47 Answered Questions

[SOLVED] How to configure port for a Spring Boot application

22 Answered Questions

1 Answered Questions

[SOLVED] How to serve (React-)html pages in Spring Boot 5?

2 Answered Questions

[SOLVED] Groovy - Ambigous handler methods

1 Answered Questions

[SOLVED] Spring boot Ambiguous handler

4 Answered Questions

[SOLVED] Passing an Array or List to @Pathvariable - Spring/Java

1 Answered Questions

How to handle 404 when using @RequestMapping for Restful api call

  • 2015-03-25 16:10:59
  • color
  • 758 View
  • 0 Score
  • 1 Answer
  • Tags:   spring

Sponsored Content