webflux+kotlin响应处理

5lhxktic  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(283)

当结合使用springwebflux和kotlin协程时,我很难理解一个简单的restfulws响应处理场景。假设我们的rest控制器中有一个简单的ws方法,该方法可能返回大量(数百万)响应“things”:

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

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

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

这里的想法是响应要么是成功的(返回一个空的错误流和一个事物流),要么是失败的(当事物流为空时包含在相应的流中的错误)。在模块化编程中,这是一种非常常见的响应习惯用法。我现在的问题是,如何使这个习惯用法适应kotlin/springwebflux中的被动方法?
我知道可以只返回所描述的响应(或者对于java用户来说是mono),但是这在一定程度上违背了被动响应的目的,因为整个mono必须在序列化时存在于内存中。有什么办法解决这个问题吗?我现在能想到的唯一可能的解决方案是一个定制的spring编码器,它足够聪明,可以传输错误或事物(无论存在什么)。

fcy6dtqo

fcy6dtqo1#

每次返回成功/错误如何 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
}

相关问题