TL;DR
-
TransactionSynchronizationManager.forCurrentTransaction
で、現在のコンテキストに対するTransactionSynchronizationManager
を取得できる -
TransactionSynchronizationManager
にはリソースをバインドできる- ただし、
key
/value
共にnull
は設定不可
- ただし、
やり方
基本操作は以下の通りです。
サンプルコードはKotlin
になっていますが、操作そのものはJava
もほぼ同じです。
import org.springframework.transaction.reactive.TransactionSynchronizationManager
import reactor.core.publisher.Mono
val key: Any = /* 文字列など、任意の非nullキー */
val value: Any = /* トランザクション内で一意にしたい任意の非null値 */
// トランザクション非開始時はエラーになる
val manager: Mono<TransactionSynchronizationManager> = TransactionSynchronizationManager.forCurrentTransaction()
// 値の設定(keyに対して既に値がバインドされているとエラーになる)
manager.doOnNext { bindResource(key, value) }
// 値の読み出し(バインドされていなければnullになる)
val readValue: Mono<Any> = manager.map { getResource(key) ?: throw RuntimeException("値が取得できませんでした") }
TransactionSynchronizationManager
に関する詳しい情報はJavadoc
をご参照ください。
おまけ
自分が考えていた利用例です。