如何处理 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);
我有一个这样定义的端点:
@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);