java - 如果实体不存在,如何告诉 Spring Data-repository delete 方法不抛出异常?

标签 java spring spring-data

我正在使用 SpringData 的存储库。如果我尝试通过不存在或从不存在的 ID 删除实体,则会引发异常。由于我不想在删除之前检查该实体是否存在,所以它会静默失败会很好。这会使它变得更容易,因为可观察到的行为是相同的——在调用之后实体不再存在。它是否已被删除或从未存在过,我不在乎。

有没有办法修改 delete(EntityId) 的默认行为,以便在实体不存在时不会抛出异常?

Documentation of SpringData's delete表示如果实体不存在,它将抛出异常。

最佳答案

更新答案(反对票后)

我原来的回答(下面)实际上是错误的:我对这个问题的理解也受到了对 EmptyResultDataAccessException 缺失引用的影响。在官方 JavaDoc 中(正如 Adrian Baker 在他的评论中所报告的那样)。

因此 Yamashiro Rion 建议的解决方案可能是解决此问题的更好方案

if (repository.existsById(entityId)) {
    repository.deleteById(entityId);
}

或这个(没有 if ,但可能表现更差):

repository.findById(entityId)
    .map(repository::delete)

原始(错误)答案

JavaDocs 说 IllegalArgumentException如果提供的参数 (id, entity, Iterable<T>) 为 null 而不是 if entity does does not exsits 将被抛出。

如果你需要避免IllegalArgumentException您可以实现一个自定义删除方法来检查 id != null :

public void customDelete(ID id) {
    if(id != null){
        this.delete(id);
    }
}

查看this docs section如果您不知道如何添加“Spring Data 存储库的自定义实现”

关于java - 如果实体不存在,如何告诉 Spring Data-repository delete 方法不抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38785622/

相关文章:

java - Spring Data java.lang.NoSuchMethodError 错误

java - Spring/JPA 持久性是否可能有 "connection preparation"

java - Java中重定向到隐藏的url

java - Apache Commons Net FTPClient 中止文件存储

java - Activity 上的透明 DialogFragment

java - 向主线程发送线程错误信号

java - IllegalAccessError : tried to access class . ..LoggingSystemProperties 来自类 ...LoggingApplicationListener

java - Spring 的 @EntityListeners 在使用 @Postpersist 时抛出异常

java - 是否有@RunAs 的 Spring 模拟?

java - 将 MongoTemplate 传递给自定义存储库实现