Как получить кузов от Mono <ClientResponse>? - PullRequest
1 голос
/ 19 июня 2019

Я пытаюсь реализовать интерфейс BodyExtractor, получить тело из Mono как объект вместо него в Mono.
Я не смог найти ни одного примера реализации BodyExtractor.Мне интересно, это хорошая идея для реализации или есть какой-то другой способ получить тело как объект.

Ниже приведена строка кода, которая у меня в данный момент есть

 public Mono&ltResponseEntity&ltMono&ltJsonNode&gt&gt&gt processUnmappedApiRequest(ServerHttpRequest request, JsonNode body) {
        RequestData reqData = this.prepareReqMetadata(request, body);
        Mono&ltClientResponse&gt 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 голосов
/ 19 июня 2019

Если вы пытаетесь вернуть только объект Mono, вы можете использовать метод flatMap вместо map, чтобы вы могли избежать чего-то вроде Mono<Mono<X>> и получить только Mono<X>.

map

Преобразование предмета, испускаемого этим моно, применяя синхронный функция к нему.

flatMap

Асинхронно преобразует объект, испускаемый этим моно, возвращая значение испускается другим Mono (возможно, изменяя тип значения).

Также в ServerResponse.BodyBuilder syncBody есть метод, который может взять нормальное тело и вернуть его в Mono. Аргумент функции карты уже является не обернутым объектом, поэтому вы можете сделать что-то вроде:

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