7

でトランザクション メソッドを記述する場合、例外@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をラップしUpdateServicetry-catchブロックを持つ追加を作成することですか? それとももっとうまくやれるでしょうか?

4

1 に答える 1