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);
}
并通过像这样发送路径变量来调用此端点:
我的 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);
}
并通过像这样发送路径变量来调用此端点: