我正在尝试使两个其余端点具有相同的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个字符与简单数字区分开。如果有人找到更好的方法,请在评论中让我知道。

10-08 07:09