我正在Spring Boot中实现DELETE rest端点,我不确定以下两种方法中哪种方法更好:
首先检查具有给定ID的记录是否存在于数据库中,然后安全地将其删除。
直接在spring数据存储库上调用delete并捕获spring数据引发的EmptyResultDataAccessException以返回404响应。
我喜欢第一个代码,因为代码更具可读性,并且不涉及使用异常控制流程。但是,它涉及对db的附加调用和潜在的竞争条件。
您为什么偏爱第一种或第二种方法?
答案 0 :(得分:1)
如果使用@Transactional注释服务方法,则不会出现竞争条件,可以先检查是否存在(性能开销很小)。
另一方面,我总是喜欢尝试删除并捕获异常的简单性,这种假设是删除不存在的资源是例外。
还请注意,在REST中,不存在的资源上的DELETE通常应返回成功的HTTP状态代码200(确定)或204(否_CONTENT)。
@Transactional
public Response deleteAfterChecking(Thing thing) {
if (!repository.exists(thing)) {
repository.delete(thing);
}
return Response.NO_CONTENT;
}
public Response deleteHandlingException(Thing thing) {
try {
repository.delete(thing);
}
catch (NotFoundException e) {
// do nothing
}
return Response.NO_CONTENT;
}
答案 1 :(得分:0)
第一个选项在约定方面更好,并且可读性更好,但对大量数据则不是性能方面的,因为您需要两次调用。实际上,您无需在任何时候捕获EmptyResultDataAccessException。
尽管如此,您仍应考虑代码概念。如何传递可能不持久的对象的ID?有必要吗 ?没有您的代码,我无法判断,但我相信您应该考虑一下。