如何使用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
。
有什么想法吗?
答案 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 数组输出为:
[{}, {}, {}, {}]
除非我遗漏了什么。