使用 Spring 处理在 REST 应用程序中映射的模糊处理程序方法
Handling ambiguous handler methods mapped in REST application with Spring
我尝试使用如下代码:
@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);
}
但是我有这样的错误,我该怎么办?
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]
Spring 无法区分请求 GET http://localhost:8080/api/brand/1
将由 getBrand(Integer)
还是由 getBrand(String)
处理,因为您的映射不明确。
尝试为 getBrand(String)
方法使用查询参数。这似乎更合适,因为您正在执行查询:
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public Brand getBrand(@PathVariable Integer id) {
return brandService.getOne(id);
}
@RequestMapping(method = RequestMethod.GET)
public List<Brand> getBrands(@RequestParam(value="name") String name) {
return brandService.getSome(name);
}
使用上述方法:
GET http://localhost:8080/api/brand/1
之类的请求将由 getBrand(Integer)
处理。
GET http://localhost:8080/api/brand?name=nike
之类的请求将由 getBrand(String)
处理。
提示:作为一种常见的做法,资源集合更喜欢复数名词。因此,请使用 /brands
.
而不是 /brand
@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);
}
当您 运行 应用程序并访问您尝试编码的端点时,您会意识到以下内容,'http://localhost:8086/brand/1' and 'http://localhost:8086/brand/FooBar' 对应于相同的 URL 格式(可以描述作为协议+端点+'brand'+)。因此,如果 SpringBoot 应该使用 String 数据类型或 Integer 调用函数 'getBrand',则本质上是混淆的。因此,为了克服这个问题,我建议您使用@cassiomolin 提到的查询参数,或者为两个调用设置单独的路径。这可能违反 REST 原则,但假设您只是在做一个示例应用程序,这是另一种解决方法。
@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);
}
这对我有用。
我尝试使用如下代码:
@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);
}
但是我有这样的错误,我该怎么办?
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]
Spring 无法区分请求 GET http://localhost:8080/api/brand/1
将由 getBrand(Integer)
还是由 getBrand(String)
处理,因为您的映射不明确。
尝试为 getBrand(String)
方法使用查询参数。这似乎更合适,因为您正在执行查询:
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public Brand getBrand(@PathVariable Integer id) {
return brandService.getOne(id);
}
@RequestMapping(method = RequestMethod.GET)
public List<Brand> getBrands(@RequestParam(value="name") String name) {
return brandService.getSome(name);
}
使用上述方法:
GET http://localhost:8080/api/brand/1
之类的请求将由getBrand(Integer)
处理。GET http://localhost:8080/api/brand?name=nike
之类的请求将由getBrand(String)
处理。
提示:作为一种常见的做法,资源集合更喜欢复数名词。因此,请使用 /brands
.
/brand
@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);
}
当您 运行 应用程序并访问您尝试编码的端点时,您会意识到以下内容,'http://localhost:8086/brand/1' and 'http://localhost:8086/brand/FooBar' 对应于相同的 URL 格式(可以描述作为协议+端点+'brand'+)。因此,如果 SpringBoot 应该使用 String 数据类型或 Integer 调用函数 'getBrand',则本质上是混淆的。因此,为了克服这个问题,我建议您使用@cassiomolin 提到的查询参数,或者为两个调用设置单独的路径。这可能违反 REST 原则,但假设您只是在做一个示例应用程序,这是另一种解决方法。
@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);
}
这对我有用。