ReactiveSecurityContext.getContext () возвращает null при вызове в пределах kotlin runBlocking {} - PullRequest
0 голосов
/ 17 июня 2020

У меня есть ситуация, когда у меня есть новый код библиотеки, написанный в функции 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())
  }
}

}

...