从 Spring WebFlux 返回 Flux<String> 返回一个字符串而不是 JSON 中的字符串数组

Posted

技术标签:

【中文标题】从 Spring WebFlux 返回 Flux<String> 返回一个字符串而不是 JSON 中的字符串数组【英文标题】:Returning Flux<String> from Spring WebFlux returns one string instead of array of strings in JSON 【发布时间】:2018-07-03 10:42:33 【问题描述】:

Spring WebFlux 的新手,试图在一个端点返回字符串数组,由于某种原因,它返回一个连接字符串而不是 JSON 数组。

用一些类包装它可以解决问题,但想知道如何实际返回字符串数组?例如,返回 Array&lt;String&gt; 按预期工作

class Wrapper(val data: String) 

@RestController
class Test() 
     @RequestMapping("/wrapped") // Returns valid JSON array: ["value":"Hello","value":"World"]
     fun b() = Flux.just(Wrapper("Hello"),Wrapper("World"))
     @RequestMapping("/raw") // Returns not valid JSON with just one concatenated string: HelloWorld
     fun a() = Flux.just("Hello", "World")

【问题讨论】:

【参考方案1】:

在 Twitter https://twitter.com/sdeleuze/status/956136517348610048 上得到了 Sébastien Deleuze(Spring 框架提交者)的回答

确实,当元素类型为String时,handler方法应该直接提供格式良好的JSON String块,不涉及与Jackson的序列化。

【讨论】:

那么如果我们想让字符串彼此分离,我们需要做什么呢? 答案很明确:你必须把它包起来。上面的答案有效;虽然你也可以这样做:fun a() = Flux.just("Hello", "World").collectList() 转换为列表会失去反应 确实答案是正确的。这也包含在文档docs.spring.io/spring/docs/current/spring-framework-reference/… 它不会因为你得到一个 Mono 而失去反应

以上是关于从 Spring WebFlux 返回 Flux<String> 返回一个字符串而不是 JSON 中的字符串数组的主要内容,如果未能解决你的问题,请参考以下文章

Spring WebFlux,单元测试 Mono 和 Flux

如何在 Spring Webflux 中返回 Mono<Map<String, Flux<Integer>>> 响应?

Spring Webflux(Mono/Flux) 与 AOP 在拦截时触发 REST 调用并使用 Mono/Flux

Spring WebFlux:从控制器提供文件

Spring WebFlux(Flux):如何动态发布

使用 Spring Webflux 返回元素列表