5
トランザクションメソッドを@Async
と記述すると、@Transactional
の例外をキャッチすることはできません。 ObjectOptimisticLockingFailureException
のように、トランザクションコミットなどの間にメソッド自体の外部にスローされるためです。@Asyncでトランザクション例外をキャッチする方法は?
例:
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
};
}
}
をしかし、私は場合にのみ、別の方法で指定された例外を処理することを好むだろうそれは内で発生します。
質問:どうすればを受け取ることができます?
唯一の機会ですか:@Service
を追加してをラップし、try-catch
ブロックを持っていますか?それとももっとうまくできますか?
実際に自己注入のための有効な使用法であれば十分です。問題は、それは? – membersound
@ mememound:私の意見では、それは有効です。それを悪用して、1000行の "神のクラス"になるようにすることも可能です。しかし、あなたの例外処理はこのクラスに特有なので、なぜクラスに入れないのですか?もし誰かがそれを悪い習慣と考えるなら、彼らはここにコメントを残すことができます... – user140547
それはうまくいかず、「1豆の間に循環依存があります。 spring-boot.1.4.0 with spring.4.2.3 – membersound