【问题标题】:Spring where to throw exceptionSpring在哪里抛出异常
【发布时间】:2016-03-10 08:35:29
【问题描述】:

我正在开发一个基于 Spring MVC 的新应用程序。 我有多个流程,控制器将向业务经理发出请求,而进一步的业务经理将与 DAO 层对话以检索数据。

在某些情况下,我可能无法从 DAO 取回数据。 我想了解处理这种情况的最佳方法。

1) 如果没有为查询检索到数据,则将自定义异常(如“未找到内容”)从 DAO 层抛出到业务层,然后再到控制器,让控制器决定要做什么。

2) 将空白/null Pojo 对象返回给业务经理,让经理将异常抛给 Controller。

3) 控制器从 Manager 接收 null/blank 并决定如何处理。

我发现第一种方法更好,因为当抛出异常时,我有完整的堆栈跟踪来了解问题的确切发生位置,但不利的一面是,我最终会在签名中使用 Exception 来弄乱我的代码。

数字 3 将使代码保持干净,但我无法确定数据检索失败的确切位置,因为可能会从业务层多次调用 DAO。

【问题讨论】:

    标签: spring hibernate spring-mvc exception-handling


    【解决方案1】:

    在没有匹配记录的情况(即没有要处理的数据)实际上异常的情况下抛出异常。

    这在很大程度上取决于您的域的具体情况,但如果数据库中没有匹配的对象,最好从 DAO 简单地返回一个空容器对象。即:Collections.emptyList()Optional.empty() 或具有类似语义的东西。 情况下返回null,毕竟是2015年。

    如果在您的业务领域中没有匹配数据是一种异常情况,请将其转换为服务层中的特定异常,并让控制器通过再次转换来处理:转换为错误 HTML 页面、某些特定的 XML 或 JSON 响应或无论您的用户使用什么界面与您的系统交互。

    【讨论】:

      【解决方案2】:

      DAO 层执行查询并返回结果。它不关心结果,所以“没有找到”不可能是 DAO 层的异常情况。可以在业务层,但不一定。

      我无法确定数据检索失败的确切位置

      如果您的用例是http://server/something/2 并且something 2 在数据库中不存在,那么服务器端根本没有故障。因此,如果没有异常,或者控制器中只有一个异常,那么您可以非常确信没有数据返回给客户端,因为不存在数据。

      【讨论】:

        【解决方案3】:

        我建议您在每一层都抛出自定义异常。每一层都应该知道异常处理。

        下面的链接解释得很漂亮。

        Handling Dao exceptions in service layer

        【讨论】:

          猜你喜欢
          • 2013-02-08
          • 1970-01-01
          • 2019-01-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-15
          • 1970-01-01
          • 2013-03-23
          相关资源
          最近更新 更多