如何使用 Spring 的 WebClient HTTP POST Flux<String> 作为 JSON 数组?

How to HTTP POST a Flux<String> as a JSON array using Spring's WebClient?

如何使用 Spring 的反应式 WebClient 到 POST 一个 Flux<String> 作为 JSON 数组?

Flux<String> stringFlux = Flux.fromIterable(objects).map(MyObject::getSomeString);

WebClient.create(baseUrl)
  .post()
  .uri(myUrl)
  .contentType(MediaType.APPLICATION_JSON)
  .body(stringFlux, String.class)
  .exchange()
  .flatMap(response -> {
     if (response.statusCode().is2xxSuccessful()) {
       // Do something
     }
     return response.bodyToMono(Void.class);
   })
   .block();

这会发送请求,但不会将其作为 JSON 字符串数组发送。

我看到还有另一个 body() 接受 ParameterizedTypeReference 的签名,所以我尝试了这个:

.body(stringFlux.collectList(), new ParameterizedTypeReference<>() {})

但这实际上会导致编译错误(我在 Java 11):

Error:java: com.sun.tools.javac.code.Types$FunctionDescriptorLookupError.

有什么想法吗?

好吧,我会被诅咒的。我使用 ParameterizedTypeReference 让它工作。通常情况下,编译错误总结了它。我在声明 new ParameterizedTypeReference<>() {} 时省略了类型参数。提供类型就可以了,并将我的 Flux<String> 作为 JSON 数组发布:

.body(stringFlux.collectList(), new ParameterizedTypeReference<List<String>>() {})

IntelliJ 告诉我这种类型是推断出来的,但显然不是。

你可以在没有 ParametrizedTypeRefrence 的情况下使用 List.class 就足够了。

.body(stringFlux.collectList(), List.class)

投票的解决方案似乎没有产生上述结果。这似乎流式传输 JSON 对象列表(这是 Webclient 的目的)而不是发送 JSON 数组结构。 我用该技术得到的结果是:

{}{}{}{}

A JSON 数组输出为:

[{}, {}, {}, {}]

除非我遗漏了什么。

.body(BodyInserters.fromFormData(stringFlux))

不确定这是否是正确答案。 发送 List<> as body

对我有用