Spring Rest Controller 通过 id/ids 方法查找

Spring Rest Controller find by id/ids methods

我的 Spring RestController 中有以下方法:

@RequestMapping(value = "/{decisionId}", method = RequestMethod.GET)
    public DecisionResponse findById(@PathVariable @NotNull @DecimalMin("0") Long decisionId) {
....
}

现在我需要添加通过 {decisionIds} 找到一组 DecisionResponse 的可能性。像这样:

@RequestMapping(value = "/{decisionIds}", method = RequestMethod.GET)
    public List<DecisionResponse> findByIds(@PathVariable @NotNull @DecimalMin("0") Set<Long> decisionIds) {
....
}

以下两种方法不能同时使用。

实现此功能的正确方法是什么?即使我只需要 1 个 Decision 对象,我是否应该只留下一个等待 {decisionIds} 和 returns 集合的方法(第二个)?还有其他正确的方法来实现吗?

你的问题是你不能在同一个端点上使用两种不同的方法

换句话说,你不能同时拥有这两个方法:

@RequestMapping(value = "/{decisionId}", method = RequestMethod.GET)
    public DecisionResponse findById(@PathVariable @NotNull @DecimalMin("0") Long decisionId) {
....
}
@RequestMapping(value = "/{decisionIds}", method = RequestMethod.GET)
    public List<DecisionResponse> findByIds(@PathVariable @NotNull @DecimalMin("0") Set<Long> decisionIds) {
....
}

因为

@RequestMapping(value = "/{decisionIds}", method = RequestMethod.GET)

@RequestMapping(value = "/{decisionId}", method = RequestMethod.GET)

是同一个端点。

因此当您在 http://<host>/19 上有 HTTP 请求 GET 时,您无法确定要使用哪种方法。

解决方案

更清楚地重命名端点以避免冲突

@RequestMapping(value = "/decision/{Id}", method = RequestMethod.GET)

@RequestMapping(value = "/decisions/{Id}", method = RequestMethod.GET)

希望对您有所帮助。

您可以为发送单个长值和长值数组创建一个端点:

@RequestMapping(value = "/{decisionIds}", method = RequestMethod.GET)
    public List<DecisionResponse> findByIds(@PathVariable @NotNull @DecimalMin("0") Set<Long> decisionIds) {
          System.out.println(decisionIds);
}

并通过像这样发送路径变量来调用此端点:

http://localhost:8080/11,12,113,14