У меня есть ситуация, когда у меня есть новый код библиотеки, написанный в функции kotlin приостановки. Все отлично работает, пока в игру не войдет java. Как только появляется Java, мне нужно иметь другую функцию, которая обертывает этот вызов в закрытие runBlocking.
При использовании версии, которая вызывается из Java (то есть версии runBlocking), SecurityContextHolder. getContext (). FlatMap {...} код никогда не вызывается. Поскольку контекст подписчика кажется потерянным.
Я ищу предложения о том, как сохранить функцию приостановки и позвонить из Java. Или для предложений о том, как сделать доступной аутентификацию из контекста безопасности.
работает
suspend fun doSomething() {
getFilter()
}
Не работает
fun doSomethingBlocking() {
runBlocking {
doSomething()
}
}
fun getFilter(jwt: String? = null): ExchangeFilterFunction {
return ExchangeFilterFunction { request: ClientRequest, next: ExchangeFunction ->
if (StringUtils.isBlank(jwt)) {
ReactiveSecurityContextHolder.getContext()
.flatMap {
next.exchange(ClientRequest.from(request).headers { headers: HttpHeaders ->
headers.add(HttpHeaders.AUTHORIZATION, TOKEN_TYPE + it.authentication.credentials) }
.build())
}
} else {
next.exchange(ClientRequest.from(request)
.headers { headers: HttpHeaders -> headers.add(HttpHeaders.AUTHORIZATION, TOKEN_TYPE + jwt) }
.build())
}
}
}