Java 如何用单声道对通量进行平面映射?
我正在构建一个调用两个REST资源的服务。第一个调用检索项目列表,第二个调用获取列表中每个项目的详细信息Java 如何用单声道对通量进行平面映射?,java,spring-webflux,project-reactor,Java,Spring Webflux,Project Reactor,我正在构建一个调用两个REST资源的服务。第一个调用检索项目列表,第二个调用获取列表中每个项目的详细信息 Flux<Result> search(query) { return client.post().uri("/search") .body(BodyInserters.fromObject(query)) .retrieve() .bodyToMono(SearchResults.class) .flatMapIt
Flux<Result> search(query) {
return client.post().uri("/search")
.body(BodyInserters.fromObject(query))
.retrieve()
.bodyToMono(SearchResults.class)
.flatMapIterable(r -> r.getResults())
.flatMap(this::detail);
}
Mono<Detail> detail(result) {
return client.get().uri("/detail/{id}", result.id)
.retrieve()
.doOnNext(System.out::println))
.bodyToMono(Detail.class);
}
该测试失败的原因是:
java.lang.AssertOnError:预期“assertNext”失败(预期:onNext();实际:onComplete())
我在这个阶段有点卡住了,反应堆文档使用了flatMap
来处理这种情况,看起来子请求(详细信息)已经发送了。看着维尔莫克,我看到他能够做出回应,但我什么也没有了
有人知道哪里出了问题吗?您能调用subscribe作为detail函数中的最后一条语句吗?是的。我可以执行
client.get().uri(“/detail/{id}”)..subscribe()
,但这会返回一个可丢弃的
,它与doOnNext
中的相同,该块永远不会执行。这似乎是由于bodyToMono
无法解组Xml响应体造成的。但是我在流上和日志中都没有错误。如果Http响应不是200,则retrieve()将导致Mono.error,在这种情况下,将不会调用doOnNext。您可以尝试改用.retrieve(),然后使用.map(resp->{System.out.println(resp.statusCode());return resp}并进一步调试它。您可以将响应作为字符串获取,然后将其记录下来,然后使用Jackson手动将其解码为JSON对象。只需使用.bodytomino(string.class).map(s->{System.out.println(s);//此处使用Jackson解码并返回结果对象}
StepVerifier.create(target.search(query))
.assertNext(d -> {
assertThat(d.getField()).isEqualTo("detailed");
})
.verifyComplete();