Spring CrudRepository可以抛出什么运行时异常?

2022-08-31 14:59:55

我有这个Spring Data,它处理数据库上的CRUD操作。CrudRepository

@Repository
public interface IUserRepository extends CrudRepository<User, String> {

}

User是我的数据库的用户表的实体。 即向存储库添加以下操作:CrudRepository

  • delete(String ID)
  • findOne(String ID)
  • save(User user)

文档中所述,如果给定的 id 为 null,则删除和查找操作将引发,而保存操作不会引发任何异常。IllegalArgumentException

问题在于,CrudRepository 的 javadoc 没有提到这些操作引发的其他异常。例如,它不会告诉该操作在数据库中不存在提供的 ID 的情况下会引发 a。delete(String ID)EmptyResultDataAccessException

在操作的javadoc中,不清楚如果您插入了一个中断了一个数据完整性约束(在唯一字段和外键上)的新用户,则会引发哪些异常。此外,它不会警告您是否正在编写新的或现有的用户:它只是创建一个新用户或覆盖(如果存在)(因此它是插入+更新操作)。save(User user)

在企业应用程序中,我应该能够捕获操作可以引发的每个可抛出异常,并且我应该在操作的javadoc中阅读有关此内容的信息。

您知道有关异常的任何明确文档吗?CrudRepository


答案 1

Spring具有内置的异常转换机制,因此JPA持久性提供程序抛出的所有异常都转换为Spring的DataAccessException - 对于所有用@Repository(或配置)注释的bean。

主要有四组——

  • 非瞬态数据访问异常 - 这些是异常重试将失败的异常,除非更正异常的原因。因此,例如,如果传递不存在的 id,则除非数据库中存在该 id,否则它将失败。

  • 可恢复数据访问异常 - 这些是前一个的“相反” - 可恢复的异常 - 经过一些恢复步骤。有关 API 文档中的更多详细信息

  • ScriptException - 例如,在尝试处理格式不正确的脚本时,与 SQL 相关的异常。

  • TransientDataAccessException - 当没有任何显式步骤即可进行恢复时,这些是例外,例如,当数据库超时时,您将在几秒钟后重试。

也就是说,查找有关所有异常的文档的理想位置 - 在API本身中 - 只需浏览DataAccessException的层次结构即可。


答案 2

我捕获了父异常 DataAccessException。

import org.springframework.dao.DataAccessException;

enter image description here


推荐