如何从Mono <ClientResponse>获取主体?

时间:2019-06-19 07:17:40

标签: java project-reactor reactor reactor-netty

我正在尝试实现BodyExtractor接口,将Mono 的主体作为对象而不是Mono中的主体。
我找不到BodyExtractor实现的任何示例。我想知道这是实现它的一个好主意,还是有其他方法可以使身体成为对象。

下面是我当前拥有的代码行

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

在此方法中,我的返回类型为Mono >>,并且我尝试将其转换为Mono >,因为我的团队不同意Mono中的Mono。

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

请在这里帮助我。

1 个答案:

答案 0 :(得分:0)

如果您尝试仅返回Mono对象,则可以使用flatMap方法而不是map,这样就可以避免使用Mono<Mono<X>>之类的方法Mono<X>

map

  

通过应用同步来变换此Mono发出的项目   功能。

flatMap

  

异步转换此Mono发出的项目,返回   另一个Mono发出的值(可能会更改值类型)。

此外,ServerResponse.BodyBuilder syncBody上有一个方法可以获取正常的正文并将其返回到Mono中。 Map函数的参数已经是未包装的对象,因此您可以执行以下操作:

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