【问题标题】:Kotlin Suspend Function Loses ReactiveSecurityContext when calling javaKotlin 挂起函数在调用 java 时丢失 ReactiveSecurityContext
【发布时间】:2020-10-11 22:47:12
【问题描述】:

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

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

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

【问题讨论】:

    标签: java kotlin kotlin-coroutines suspend kotlin-java-interop


    【解决方案1】:

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

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

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

    【讨论】:

    • 您应该能够根据需要多次访问此上下文。只要我不从 Kotlin 调用 java,它就可以正常工作。在为请求提供服务时,我可以随时访问。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-16
      • 2019-05-30
      • 1970-01-01
      • 2021-03-06
      • 2019-09-09
      • 1970-01-01
      • 2021-01-20
      • 2018-12-11
      相关资源
      最近更新 更多