【问题标题】:Can I use spring DataAccessException directly in service layer我可以在服务层直接使用spring DataAccessException吗
【发布时间】:2012-05-20 11:07:07
【问题描述】:

我可以直接在服务层使用spring DataAccessException吗?这是在服务层中传播框架工作类的良好实践/设计吗?

我应该在 dao 层捕获 DataAccessException 并将其重新抛出为更通用的异常吗?

【问题讨论】:

    标签: spring dao service-layer


    【解决方案1】:

    我认为 DAO 层可以抛出该异常。服务层已经知道持久层,因此不会创建额外的依赖关系。

    【讨论】:

    • 它不会影响服务层和 dao 层之间的关注点分离。你的方法是什么?
    • 没有分离——这是一种单向的关系,这是必然的。服务层知道 DAO,但反之则不然。没关系。
    • 服务层知道 DAO,但它可能不知道 Spring。它不会引入新的库依赖,但可能是概念上的依赖。也许在实践中不寻常,但可以想象,DAO 可以以多种方式使用……不确定这个;还在想。
    • 服务层已经知道Spring;它注入了 DAO。
    • 如果我需要在 UI 层再次抛出 DataAccessException 会怎样......它不会在所有层中产生高耦合吗?
    【解决方案2】:

    最好将 DataAccessException(从 DAO 层抛出)映射/包装到特定于应用程序的异常层次结构(在服务层中),以便依赖/调用层只需处理您的应用程序特定异常类。

    【讨论】:

    • 我不同意这一点。服务层可能会映射它,但持久层包装自己的异常没有任何价值。服务层应该捕获并处理它。包装它只会丢失信息。
    • 我的意思是服务层应该包装它。由于问题在服务层,我没有明确提到它。另外,我认为包装不会丢失异常跟踪。
    • 不,服务层不应该包装它。它应该处理它而不是重新抛出。那是非常不同的。
    • 如果像 DataAccessResourceFailureException/UncategorizedDataAccessException 这样的 DataAccessException 子类被抛出,你期望什么样的“处理”?
    • 那么,当你说“它应该处理它而不是重新抛出”时,如何告诉 UI 层发生了不好的事情。
    【解决方案3】:

    就个人而言,我在服务层捕获所有已检查的异常并抛出我自己的 ServiceExceptions,用捕获的异常来初始化它们。这样异常信息不会丢失,Controllers也不需要处理低级异常。但是在 DAO 层没有必要这样做。

    在“Effective Java”(J. Bloch)中有一个非常好的关于异常处理的章节,它和本书的其余部分一样值得一读。第 61 条处理这个问题。

    http://books.google.de/books/about/Effective_Java.html?id=Ft8t0S4VjmwC

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-22
      • 2013-02-11
      • 1970-01-01
      • 2021-04-24
      • 2018-06-30
      • 2011-02-05
      • 2012-06-12
      相关资源
      最近更新 更多