问题描述
我在代码中使用@Transactional
,并且创建了一个自定义异常,以在UI中以特定格式显示错误消息。
public class MyCustomException extends RuntimeException
遇到此异常时,我仍然想回滚我的事务,就像发生任何其他异常一样。
为使其正常工作,我在下面编写代码:
// service method called from rest controller
public List<String> getMyData() {
List<String> errors = new ArrayList();
try {
businessMethod();
} catch (MyCustomException e) {
log.error(e.getMessage);
errors.add(e.getMessage)
}
return errors.
}
@Transactional(rollbackFor = {MyCustomException.class,RuntimeException.class,Exception.class})
public String businessMethod() {
// Business logic to get data that can throw MyCustomException
}
我的问题是:
-
如果我在
MyCustomException.class
中提到rollbackFor
,是否还需要提及RuntimeException.class,Exception.class
。否则,rollbackFor
中提到的任何内容都会与默认的异常一起添加到该异常中,并为其回滚事务。 -
尽管我从
MyCustomException
中转义了businessMethod()
,但是在其调用方法getMyData()
上却抓住了它。我假设在发生异常的情况下事务将被回滚,对吗?
解决方法
-
该交易将在任何
RuntimeException
上回滚,因此MyException.class
段中不需要声明您自己的rollbackFor
,因为您的MyException
可以扩展RuntimeException
。如果声明Exception.class
,则将在发生任何异常时执行回滚。但就您而言,您根本不需要rollbackFor
。 -
是的,这是正确的。您的交易以
businessMethod()
开始和结束。