控制器方法接口:
@RequestMapping(
method = [RequestMethod.GET],
value = ["/list"],
produces = ["application/json"]
)
suspend fun list(): ResponseEntity<Flow<MyClass>>
字符串
控制器方法实现:
override suspend fun list(): ResponseEntity<Flow<MyClass>> {
val list: List<MyClass> = service.getMyClass()
val flow = flow { emitAll(list.asFlow()) }
return ResponseEntity.ok(flow)
}
型
在升级到Sping Boot 3(Spring 6)之前,该端点作为非流端点工作得很好。
升级后,它会产生一个错误:
Unexpected end-of-input: expected close marker for Array
型
我找到了这个页面:
https://github.com/spring-projects/spring-framework/wiki/What%27s-New-in-Spring-Framework-6.x
这是一条线:
Spring WebFlux
Flux return values for non-streaming media types (no longer collected to List before written).
型
所以我明白新版本的Spring试图流我的数据,我有Content-Type: application/json
并不重要。
问题是:我如何恢复旧行为?
我的前端目前需要它。
我看到这个答案https://stackoverflow.com/a/61146874/22210497描述了旧的行为。
现在这段代码已经从Spring代码库中消失了。
可能是在这个问题上的想法-https://github.com/spring-projects/spring-framework/issues/28398
1条答案
按热度按时间xdnvmnnf1#
所以可能我通过从Spring 5版本中获取代码来管理它:
字符串
首先,这段代码检查我们是否有
Mono
或流媒体类型。如果是,则调用超类的
encode
方法。如果否,则它在写入之前收集
Flux
到List
。不确定它是否正确,哪里可以有一些警告,但它的工作...