【问题标题】:What RuntimeException can Spring CrudRepository throw?Spring CrudRepository 异常
【发布时间】: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异常的明确文档吗?

【问题讨论】:

    标签: java spring spring-data


    【解决方案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,我可以从哪里了解到这一点?
      猜你喜欢
      • 2018-03-02
      • 1970-01-01
      • 1970-01-01
      • 2014-12-30
      • 2019-02-25
      • 2014-06-24
      • 2017-07-04
      • 2017-04-25
      • 2016-07-01
      相关资源
      最近更新 更多