6

我正在使用 Spring 3 和 Hibernate 3.6 开发 Web 应用程序。@Transactional我对注释和代码结构有一些疑问。

-> 当我使用@Transactional(使用 Spring 的事务管理)时,@Transactional在调用它们时是否必须用 try/catch 包围 -annotated 方法?

例如,当我得到一个加载、更改和返回一个对象的方法时,我从另一个类调用它:我必须用 try/catch 包围调用吗?也许出了点问题,没有返回对象,数据库连接失败..我不知道。

直到现在,我认为@Transactional关心所有可能发生的异常,并在发生错误时回滚该事务中的每个操作。但如果发生这种情况,我必须以某种方式通知用户。当我在 try-block 中调用 transactional-method 并回滚时,catch 块被激活?我可以告诉用户“确实出了问题”。否则可能不会通知用户?

或者检查是否有返回的对象(if/else)就足够了,那么我不需要try/catch?我是新手,我想听听其他人如何构建他们的代码。谢谢 :-)

4

3 回答 3

4

使用 HandlerExceptionResolvers 和 @ExceptionHandlers 在 Spring 中处理异常非常容易。我倾向于专门使用@ExceptionHandler。

您可以使用@ExceptionHandler来处理特定异常,而不是自己在 try-catch 块中处理它。

如果用户想要一个未找到的资源,而您想要发送 404。

@ExceptionHandler(NotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public void handleNotFoundException(NotFoundException exc) {
  // log something.
}

如果存在服务器问题,您想发送 500

@ExceptionHandler(SomeException.class)
public void handleException(SomeException exc, WebRequest request, HttpServletResponse response) {
    response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Sorry dude, my server broke");
}

您还应该严格处理异常。一般来说,你不应该这样做@ExceptionHandler(Exception.class),我也相信它按顺序工作,所以如果你确实处理了一般的异常,它应该是类中的最后一个方法。

于 2011-03-21T14:34:15.953 回答
1

Spring 使用的关键特性是Exception Translation

依靠异常转换来生成您的客户端层理解的异常,并在可能的情况下仅在此处使用 try / catch。

于 2011-03-21T14:41:05.543 回答
0

谢谢你回答我。我通读了链接(spring 文档),发现以下内容:

“但是,DAO 会抛出普通的 HibernateException(这是未经检查的,因此不必声明或捕获),这意味着调用者只能将异常视为通常是致命的 - 除非他们想依赖 Hibernate 自己的异常层次结构。捕获特定原因“如果不将调用者与实现策略联系起来,就不可能出现乐观锁定失败。这种权衡对于基于 Hibernate 和/或不需要任何特殊异常处理的应用程序来说可能是可以接受的。”

我的 DAO 基于 Plain Hibernate 3 API,所以如果我理解正确,我的 DAO 只会抛出普通的 HibernateExceptions。它们是未经检查的,不必申报或捕获。如果出现问题,使用 @Transactional 将回滚整个操作。

为了确保一切都按预期工作,我必须将我的 DAO 与我的应用程序代码联系得更紧密。例如,我可以检查一个对象是否被归还。(如果为 null - else)我还可以捕获异常,记录它并通知用户确实出了问题并且他的事务没有工作。

所以在这一点上,我仍然在想,这取决于交易:如果我可以处理结果,一切都很好 - 如果没有,我可以通知用户。

当未指定事务返回结果时,我可以使用 try/catch 来捕获 HibernateException。但是那个时候交易还回滚吗?我想,捕获 HibernateException 可以避免回滚事务。我仍然不知道该怎么办。:-(

除此之外,不幸的是,我不明白 MVC 异常处理 (@ExceptionHandler) 与此有什么关系。有一个处理异常的表,但我没有找到 HibernateException。或者你认为它会与这个一起工作:@ExceptionHandler(HibernateException.classs)?您还说您不建议以这种方式处理异常。

于 2011-03-21T16:30:42.917 回答