如何从 Mono<ClientResponse> 获取 body?

How to get body from Mono<ClientResponse>?

我正在尝试实现 BodyExtractor 接口,从 Mono 获取 body 作为 Object 而不是在 Mono 中。
我找不到 BodyExtractor 实现的任何示例。我想知道这是实现它的好主意还是有任何其他方法可以将 body 作为 object。

下面是我目前的代码行

 public Mono<ResponseEntity<Mono<JsonNode>>> processUnmappedApiRequest(ServerHttpRequest request, JsonNode body) {
        RequestData reqData = this.prepareReqMetadata(request, body);
        Mono<ClientResponse> response = commonConnector.getApiResponse(reqData);

        return response.map(respData ->  {
            int latestVersion = respData.headers().header("version").size() == 0 ? getLatestVersion(request) :
                    Integer.parseInt(respData.headers().header("version").get(0));
            List converterList;
            if((converterList = converterSequenceProvider.getConverterList(reqData.getRequestPath(), latestVersion, reqData.getVersion())) != null){
                return ResponseEntity.ok().body(respData.bodyToMono(JsonNode.class).map(respBody -> convertToDesiredVersion(converterList, respBody)));
            }
            return ResponseEntity.ok().body(respData.bodyToMono(JsonNode.class));
        });
    }

在这种方法中,我的 return 类型是 Mono< ResponseEntity< Mono< JsonNode>>> 并且我试图将其转换为 Mono< ResponseEntity< JsonNode>> 因为我的团队不同意里面的 Mono单声道。

所以这里的重点是我不想使用 bodyToMono 方法,我不确定如何使用 body 方法。

请帮帮我。

如果你想return只是一个Monoobject,你可以使用flatMap方法而不是map,这样你就可以避免像 Mono<Mono<X>> 这样的东西,只得到 Mono<X>.

map

Transform the item emitted by this Mono by applying a synchronous function to it.

flatMap

Transform the item emitted by this Mono asynchronously, returning the value emitted by another Mono (possibly changing the value type).

此外,ServerResponse.BodyBuilder syncBody 上有一个方法可以在 Mono 中使用正常的 body 和 return。 Map 函数的参数已经是一个非包装的 object,所以你可以这样做:

JsonNode jsonNode=transform(clientResponse);
return ResponseEntity.ok().syncbody(jsonNode);