でトランザクション メソッドを記述する場合、例外@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
};
}
}
ただし、指定された例外が .xml 内で発生した場合にのみ、別の方法で処理することをお勧めしますUpdateService
。
質問: どうすれば の中でキャッチできますかUpdateService
?
唯一のチャンスは、@Service
をラップしUpdateService
てtry-catch
ブロックを持つ追加を作成することですか? それとももっとうまくやれるでしょうか?