【发布时间】:2017-01-12 15:15:12
【问题描述】:
使用@Async 编写事务方法时,无法捕获@Transactional 异常。像ObjectOptimisticLockingFailureException,因为它们在事务提交期间被抛出方法本身之外。
例子:
public class UpdateService {
@Autowired
private CrudRepository<MyEntity> dao;
//throws eg ObjectOptimisticLockingFailureException.class, cannot be caught
@Async
@Transactional
public void updateEntity {
MyEntity entity = dao.findOne(..);
entity.setField(..);
}
}
我知道我可以捕获@Async 异常一般如下:
@Component
public class MyHandler extends AsyncConfigurerSupport {
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return (ex, method, params) -> {
//handle
};
}
}
但我更愿意以不同的方式处理给定的异常,前提是它发生在 UpdateService 中。
问题:我如何在UpdateService内部捕捉它?
是唯一的机会:创建一个额外的 @Service 包装 UpdateService 并具有 try-catch 块?或者我可以做得更好吗?
【问题讨论】:
标签: java spring spring-transactions spring-async