我正致力于使用Spring 3和Hibernate 3.6开发Web应用程序。我对@Transactional
注释和代码结构有一些疑问。
- >当我使用@Transactional
(使用Spring进行事务管理)时,在调用它们时是否必须使用try / catch包围@Transactional
- 带注释的方法?
例如,当我得到一个加载,更改并返回一个对象的方法时,我从另一个类调用它:我是否必须用try / catch包围调用?也许出了点问题,没有返回任何对象,数据库连接失败..我不知道。
到目前为止,我认为@Transactional
会关注所有可能发生的异常,并在发生错误时回滚此事务中的每个操作。
但如果它发生,我必须以某种方式通知用户。当我在try-block中调用transactional-method并回滚它时,catch块被激活了?
我可以告诉用户“出了问题”。否则可能不会通知用户?
或者是否足以检查是否有对象返回(if / else),那么我不需要try / catch? 我是新的,我想听听其他结构如何编码。谢谢: - )
答案 0 :(得分:4)
Handling exceptions非常简单。我倾向于专门使用@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)
,我也相信它按顺序工作,所以如果你确实处理了一般的异常,它应该是该类中的最后一个方法。
答案 1 :(得分:1)
Spring使用的主要功能是Exception Translation。
依赖异常转换来生成客户端层理解的异常,并且只在可能的情况下使用try / catch。
答案 2 :(得分:0)
“但是,DAO抛出普通的HibernateException(未经检查,因此不必声明或捕获),这意味着调用者只能将异常视为致命的 - 除非他们想要依赖Hibernate自己的异常层次结构。 如果不将调用者与实现策略联系起来,则无法捕获诸如乐观锁定失败之类的特定原因。对于强烈基于Hibernate和/或不需要任何特殊异常处理的应用程序,这种权衡可能是可以接受的。“
我的DAO基于Plain Hibernate 3 API,所以如果我理解它是正确的,我的DAO只会抛出简单的HibernateExceptions。它们是未经检查的,不必声明或捕获。 如果出现问题,使用@Transactional可以回滚整个操作。
为了确保一切正常,因为我希望它能够正常工作,我必须将DAO更接近我的应用程序代码。在那里,我可以检查一个对象是否被给予回馈。 (如果为null - 否则) 我也可以捕获异常,记录它并告知用户确实出错了,并且他的事务无效。
所以在这一点上,我仍在思考,这取决于交易: 如果我可以使用结果,一切都很好 - 如果没有,我可以通知用户。
当没有指定事务来返回结果时,我可以使用try / catch来捕获HibernateException。但是,交易仍然回滚吗?我认为,捕获HibernateException可以避免回滚事务。 我还是不知道该怎么办。 : - (
不幸的是,我不明白MVC异常处理(@ExceptionHandler)与此有什么关系。有一个处理异常的表,但我没有找到HibernateException。 或者您认为它适用于此:@ExceptionHandler(HibernateException.classs)?你也说过你不建议以这种方式处理异常。