Spring CrudRepository 异常
Posted
技术标签:
【中文标题】Spring CrudRepository 异常【英文标题】:What RuntimeException can Spring CrudRepository throw? 【发布时间】:2014-06-13 01:46:54 【问题描述】:我有这个 Spring Data CrudRepository
处理数据库上的 CRUD 操作。
@Repository
public interface IUserRepository extends CrudRepository<User, String>
User
是我的数据库的用户表的实体。 CrudRepository
将以下操作添加到存储库:
delete(String ID)
findOne(String ID)
save(User user)
如documentation 中所述,删除和查找操作会抛出IllegalArgumentException
,以防给定的 id 为空,而保存操作不会抛出任何异常。
问题在于 CrudRepository 的 javadoc 没有提及这些操作引发的其他异常。例如,如果提供的 ID 在 DB 中不存在,它不会告诉 delete(String ID)
操作会引发 EmptyResultDataAccessException
。
在save(User user)
操作的javadoc 中,如果您插入破坏了一个数据完整性约束(在唯一字段和外键上)的新用户,并不清楚会引发哪些异常。此外,它不会警告您是在编写新用户还是现有用户:它只是创建一个新用户或在存在时覆盖(因此它是插入 + 更新操作)。
在企业应用程序中,我应该能够捕获操作可以抛出的每个可抛出异常,我应该在操作的 javadoc 中阅读相关内容。
你知道任何关于CrudRepository
异常的明确文档吗?
【问题讨论】:
【参考方案1】:我捕获了父异常DataAccessException。
import org.springframework.dao.DataAccessException;
【讨论】:
【参考方案2】:Spring 具有内置的异常翻译机制,因此 JPA 持久性提供程序抛出的所有异常都转换为 Spring 的 DataAccessException - 对于所有使用 @Repository 注释(或配置)的 bean。
有四个主要组-
NonTransientDataAccessException - 这些是重试相同操作将失败的异常,除非更正异常的原因。因此,例如,如果您传递不存在的 id,除非该 id 存在于数据库中,否则它将失败。
RecoverableDataAccessException - 这些是前一个的“相反” - 可恢复的异常 - 经过一些恢复步骤。 API 文档中的更多详细信息
ScriptException - SQL 相关的异常,例如在尝试处理格式不正确的脚本时。
TransientDataAccessException - 这些是无需任何显式步骤即可恢复的例外情况,例如当数据库超时时,您将在几秒钟后重试。
也就是说,查找有关所有异常的文档的理想位置 - 在 API 本身中 - 只需通过 DataAccessException 的层次结构。
【讨论】:
感谢您提供所有异常的链接并详细解释它们的含义。 @vtor “内置异常翻译机制”是什么意思。我很好奇为什么spring文档没有明确说明某些方法会抛出这个DataAccessException,例如CrudRepository类的save方法。 出于好奇,你是怎么知道这个的?如果不求助于 Stack Overflow,我可以从哪里了解到这一点?以上是关于Spring CrudRepository 异常的主要内容,如果未能解决你的问题,请参考以下文章
CrudRepository 异常 - ParameterBinding 所需的名称不可用
扩展 CrudRepository (Spring) 时是不是需要 @Repository 注释?
Spring data : CrudRepository 的保存方法和更新
通过 HTTP 保护 Spring Data RepositoryRestResource (CrudRepository),但不在内部