Spring CrudRepository可以抛出什么运行异常?
我有这个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的层次结构。
相关文章