Spring在哪里抛出异常

时间:2015-12-05 12:19:48

标签: spring hibernate spring-mvc exception-handling

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

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

1)如果没有为查询检索数据,则将自定义异常(例如“未找到内容”)从DAO层返回到业务层,然后返回到Controller,让控制器决定要执行的操作。

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

3)Controller从Manager接收null / blank并决定如何处理它。

我发现第一种方法更好,因为抛出异常时我有完整的堆栈跟踪来了解问题究竟发生在哪里但是在缺点方面我最终会在签名中使用Exception混乱我的代码。

第3号将保持代码清洁,但我无法确定数据检索失败的原因,因为可以从业务层多次调用DAO。

3 个答案:

答案 0 :(得分:1)

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

在下面的链接中对它进行了精美的解释。

Handling Dao exceptions in service layer

答案 1 :(得分:1)

在没有匹配记录的情况下(换句话说,没有要处理的数据)实际上是异常的情况下抛出异常。

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

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

答案 2 :(得分:1)

DAO层执行查询并返回结果。它并不关心结果,所以“没有找到”不能成为DAO层的特殊情况。它可以在业务层中,但它不必。

  

我无法确定数据检索失败的原因

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