我正在尝试使两个其余端点具有相同的uri,但类型不同。
第一个将通过EAN(Int)搜索,第二个将通过id(String)搜索。我能以某种方式过载端点吗?我与Kotlin一起使用Spring Boot
@GetMapping("/book/{ean}")
fun getABookByEan(@PathVariable ean: Int) : ResponseEntity<*> {
repository.getByEan(ean)?.let {
return ResponseEntity.status(HttpStatus.OK).body(it)
}
throw ItemNotFoundException()
}
@GetMapping("/book/{id}")
fun getABookById(@PathVariable id: String) : ResponseEntity<*> {
repository.getById(id)?.let {
return ResponseEntity.status(HttpStatus.OK).body(it)
}
throw ItemNotFoundException()
}
此后,我得到一个异常(exception),即为同一端点映射了多个方法。
... NestedServletException:请求处理失败;嵌套异常是java.lang.IllegalStateException:为HTTP路径映射的模糊处理程序方法...
最佳答案
我发现,如果要坚持使用API,唯一的方法就是使用正则表达式。
@GetMapping("/book/{ean:[\\d]+}")
@GetMapping("/book/{id:^[0-9a-fA-F]{24}$}")
使用它,可以将MongoDB生成的十六进制24个字符与简单数字区分开。如果有人找到更好的方法,请在评论中让我知道。