Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何用单声道对通量进行平面映射?_Java_Spring Webflux_Project Reactor - Fatal编程技术网

Java 如何用单声道对通量进行平面映射?

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

我正在构建一个调用两个REST资源的服务。第一个调用检索项目列表,第二个调用获取列表中每个项目的详细信息

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();