如何处理 Spring RestController 中的端点冲突?

How do I deal with conflicting enpoints in Spring RestController?

我有一个这样定义的端点:

    @GetMapping(value = "/dogs/{dogId}", produces = MediaType.APPLICATION_JSON_VALUE)
    Dog getDogById(@NotBlank @PathVariable("dogId") String dogId);

我想在同一个@RestController 中定义一个这样的新端点:

    @GetMapping(value = "/dogs/collars", produces = MediaType.APPLICATION_JSON_VALUE)
    List<Collar> getAllDogCollarsByQuery(@RequestParam String dogName, @RequestParam String dogYear);

问题是每当我尝试像这样调用新端点时:

/dogs/collars?dogName=Bingo&dogYear=11

Spring 会将我的调用路由到 getDogById 方法并将我的端点 url 的其余部分映射到 @PathVariable。

我尝试向端点添加另一条路径,因此端点将如下所示:

GET /dogs/collars/search

但是当我尝试调用它时收到 HTTP 415 错误。

有没有办法解决这样的冲突?

您可以使用正则表达式来解决这个问题。

@GetMapping(value = "/dogs/{dogId:^[1-9][0-9]*}", produces = MediaType.APPLICATION_JSON_VALUE)
    Dog getDogById(@NotBlank @PathVariable("dogId") String dogId);

@GetMapping(value = "/dogs/collars", produces = MediaType.APPLICATION_JSON_VALUE)
    List<Collar> getAllDogCollarsByQuery(@RequestParam String dogName, @RequestParam String dogYear);

事实证明,将 consumes = MediaType.ALL_VALUE 添加到端点可以解决此问题。 端点定义现在如下所示:

   @GetMapping(value = "/dogs/collars", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.ALL_VALUE)
    List<Collar> getAllDogCollarsByQuery(@RequestParam String dogName, @RequestParam String dogYear);