Spring WebFlux + Kotlin响应处理



当我将Spring WebFlux与Kotlin协程结合使用时,我很难理解一个简单的RESTful WS响应处理场景。假设我们在REST控制器中有一个简单的WS方法,该方法应该返回可能大量(数百万)的响应"事物":

@GetMapping
suspend fun findAllThings(): Flow<Thing> {
//Reactive DB query, return a flow of things
}

这就像人们所期望的那样工作:只要使用流媒体类型(例如"application/x- json"),结果就会流式传输到客户端。在更复杂的服务调用中,也考虑到错误/警告的可能性,我希望返回以下形式的响应对象:

class Response<T> {
val errors: Flow<String>
val things: Flow<T>
}

这里的想法是,响应要么是成功的(返回一个空的错误流和一个事物流),要么是失败的(在相应的流中包含错误,而事物流为空)。在阻塞编程中,这是一种非常常见的响应方式。我现在的问题是,如何将这种习惯用法应用于Kotlin/Spring WebFlux中的响应式方法?

我知道它可能只是返回所描述的响应(或Mono(对于Java用户),但这在某种程度上违背了响应性的目的,因为在序列化时整个Mono必须存在于内存中。有办法解决这个问题吗?我现在能想到的唯一可能的解决方案是一个自定义的Spring Encoder,它足够智能,可以流式传输错误或事物(无论存在什么)。

如何返回每个Thing的成功/错误?

class Result<T> private constructor(val result: T?, val error: String?) {
constructor(data: T) : this(data, null)
constructor(error: String) : this(null, error)
val isError = error != null
}
@GetMapping
suspend fun findAllThings(): Flow<Result<Thing>> {
//Reactive DB query, return a flow of things
}

最新更新