使用@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
内,我更愿意以不同的方式处理给定的异常。
问题:我怎样才能在<{1>}里面
唯一的机会是:创建一个额外的UpdateService
来封装@Service
并拥有UpdateService
块吗?或者我可以做得更好吗?
答案 0 :(得分:1)
你可以试试self-injecting你的bean,它应该与Spring 4.3一起使用。虽然自我注射通常不是一个好主意,但这可能是合法的用例之一。
@Autowired
private UpdateService self;
@Transactional
public void updateEntity() {
MyEntity entity = dao.findOne(..);
entity.setField(..);
}
@Async
public void updateEntityAsync(){
try {
self.updateEntity();
} catch (Exception e) {
// handle exception
}
}