Функция приостановки Kotlin теряет ReactiveSecurityContext при вызове java
Когда я вхожу в функцию приостановки, контекст присутствует. Эта функция вызывается из функции контроллера, которая также приостановлена.
suspend fun search(searchRequest: String): String? {
val context = ReactiveSecurityContextHolder.getContext().map {
it
}.awaitFirstOrNull()
log.info("The context here at the search is $context")
return someJava.something();
}
Как только я вхожу в Java-код, контекст в java исчезает. Если я перезвоню в kotlin, контекст безопасности все равно исчезнет.
public String something() {
return someKotlin.something();
}
fun something(): String {
val context = ReactiveSecurityContextHolder.getContext().map {
it
}.awaitFirstOrNull()
log.info("The context here is always null. Why? $context")
}
Есть идеи, как решить эту проблему?
2 ответа
Эта проблема возникла из-за того, что на стороне Java был код блокировки. Как только вы блокируете, цепочка издателей прерывается, и вы теряете контекст подписчика. На заднем сайте это очевидно. Чтобы решить свою проблему, я передал контекст безопасности java-методу и просто сохранил в объекте threadlocal, чтобы к нему можно было получить доступ позже в java-коде и при необходимости передать обратно в kotlin. Это несколько уродливо, но если вы не можете изменить методы java для возврата издателя, этот маршрут - ваш единственный вариант
ReactiveSecurityContextHolder.getContext()
не предполагается использовать как глобальную переменную / хранилище.
Предполагается, что вы получите его один раз и выполните все свои действия над результатом.
Связанный ответ здесь /questions/23849550/reactivesecuritycontextholdergetcontext-pust-no-authenticationprincipal-rabotaet/23849560#23849560