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

时间:2019-01-14 18:35:19

标签: java spring-webflux project-reactor

如何使用Spring的反应式WebClient来将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

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

好吧,我该死。我使用ParameterizedTypeReference使它工作。通常情况下,编译错误会对其进行汇总。我在声明new ParameterizedTypeReference<>() {}时省略了type参数。提供类型可以解决问题,并将我的Flux<String>发布为JSON数组:

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

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

答案 1 :(得分:0)

使用ParametrizedTypeRefrence就可以在不使用List.class的情况下完成字符串操作。

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

答案 2 :(得分:0)

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

{}{}{}{}

JSON 数组输出为:

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

除非我遗漏了什么。