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

2022-06-25 00:00:00 spring java spring-data

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

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

}

User是My DB的用户表的实体。CrudRepository将以下操作添加到存储库:

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

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

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

save(User user)操作的javadoc中,不清楚在插入违反一个数据完整性约束(唯一字段和外键)的新用户时抛出哪些异常。此外,无论您编写的是新用户还是现有用户,它都不会发出警告:它只是创建一个新用户或覆盖(如果存在)(因此这是一个插入+更新操作)。

在企业应用程序中,我应该能够捕获操作可以引发的每个可抛出的异常,并且我应该在操作的javadoc中阅读这一点。

您是否了解有关CrudRepository异常的明确文档?


解决方案

Spring具有内置的异常转换机制,因此JPA持久化提供者抛出的所有异常都会转换为Spring的DataAccessException--对于所有带有@Repository(或已配置)的Bean。

主要有四个组-

  • NonTransientDataAccessException-除非纠正异常原因,否则相同操作的重试将失败。因此,如果您传递不存在的id,它将失败,除非该id存在于数据库中。

  • RecoverableDataAccessException--经过一些恢复步骤后,它们与前面的"相反"--可以恢复的异常--相反。更多详情请查看API文档

    /li>
  • ScriptException-尝试处理格式不正确的脚本时与SQL相关的异常。

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

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

相关文章