0

当我进入挂起函数时,上下文是存在的。这个函数是从一个也是挂起的控制器函数中调用的。

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") 
} 

知道如何解决这个问题吗?

4

2 回答 2

0

发生此问题是因为在 java 端有一些阻塞代码。一旦您阻塞,发布者链就会终止,并且您会丢失订阅者上下文。在后站,这是显而易见的。为了解决我的问题,我将安全上下文传递给 java 方法,并将其存储在 threadlocal 对象中,以便稍后在 java 代码中访问它并在需要时传回 kotlin。这有点难看,但是如果您无法修改 java 方法以返回发布者,则此路线是您唯一的选择

于 2020-06-23T01:28:49.720 回答
0

ReactiveSecurityContextHolder.getContext()不应该像全局变量/存储一样使用。

您应该得到它一次并对结果执行所有操作。

相关答案在这里https://stackoverflow.com/a/51350355/6167844

于 2020-06-22T11:02:16.033 回答