Spring WebFlux + Kotlin 响应处理
Spring WebFlux + Kotlin Response Handling
在将 Spring WebFlux 与 Kotlin 协程结合使用时,我在思考所谓的简单 RESTful WS 响应处理场景时遇到了一些麻烦。假设我们的 REST 控制器中有一个简单的 WS 方法,它应该 return 可能有大量(数百万)响应“事物”:
@GetMapping
suspend fun findAllThings(): Flow<Thing> {
//Reactive DB query, return a flow of things
}
这正如人们预期的那样工作:只要使用流媒体类型(例如“application/x-ndjson”),结果就会流式传输到客户端。在更复杂的服务调用中,也考虑了 errors/warnings 的可能性,我想 return 以下形式的响应对象:
class Response<T> {
val errors: Flow<String>
val things: Flow<T>
}
这里的想法是响应要么成功(return一个空的错误流和一个事物流),要么失败(错误包含在相应的流中,而事物流为空)。在阻塞编程中,这是一个非常常见的响应习惯用法。我现在的问题是如何使这个习语适应 Kotlin/Spring WebFlux 中的反应式方法?
我知道可以只 return 所描述的 Response(或 Java 用户的 Mono),但这有点违背了反应的目的,因为整个 Mono 必须在序列化时存在于内存中。有什么办法可以解决这个问题吗?我现在能想到的唯一可能的解决方案是自定义 Spring 编码器,它足够智能,可以流式传输错误或事物(无论存在什么)。
每个 Thing
返回 Success/Error 怎么样?
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
}
在将 Spring WebFlux 与 Kotlin 协程结合使用时,我在思考所谓的简单 RESTful WS 响应处理场景时遇到了一些麻烦。假设我们的 REST 控制器中有一个简单的 WS 方法,它应该 return 可能有大量(数百万)响应“事物”:
@GetMapping
suspend fun findAllThings(): Flow<Thing> {
//Reactive DB query, return a flow of things
}
这正如人们预期的那样工作:只要使用流媒体类型(例如“application/x-ndjson”),结果就会流式传输到客户端。在更复杂的服务调用中,也考虑了 errors/warnings 的可能性,我想 return 以下形式的响应对象:
class Response<T> {
val errors: Flow<String>
val things: Flow<T>
}
这里的想法是响应要么成功(return一个空的错误流和一个事物流),要么失败(错误包含在相应的流中,而事物流为空)。在阻塞编程中,这是一个非常常见的响应习惯用法。我现在的问题是如何使这个习语适应 Kotlin/Spring WebFlux 中的反应式方法?
我知道可以只 return 所描述的 Response(或 Java 用户的 Mono
每个 Thing
返回 Success/Error 怎么样?
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
}