Преобразование моно в Pojo без блока - PullRequest
0 голосов
/ 03 июня 2018

Есть ли способ конвертировать моно объекты в Java Pojo?У меня есть веб-клиент, подключающийся к сторонней REST-службе, и вместо возврата Mono я должен извлечь этот объект и запросить его.

Все найденные примеры возвращают Mono<Pojo>, но я должен получитьСам Пойо.В настоящее время я делаю это, вызывая block() в Pojo, но есть ли лучший способ избежать блока?

Проблема с блоком заключается в том, что после нескольких запусков он начинает выдавать какую-то ошибку, например, блок Завершено с ошибкой.

 public MyPojo getPojo(){
     return myWebClient.get()
                .uri(generateUrl())
                .headers(createHttpHeaders(headersMap))
                .exchange()
                .flatMap(evaluateResponseStatus())
                .block();
}


private Function<ClientResponse, Mono<? extends MyPojo>> evaluateResponseStatus() {
      return response -> {
            if (response.statusCode() == HttpStatus.OK) {
                return response.bodyToMono(MyPojo.class);
            }
            if (webClientUtils.isError(response.statusCode())) {
                throw myHttpException(response);
                // This invokes my exceptionAdvice
                // but after few runs its ignored and 500 error is returned.
            }
            return Mono.empty();
        };
    }

1 Ответ

0 голосов
/ 03 июня 2018

Не стоит блокировать работу со значением в реактивном потоке.Project Reactor предлагает вам выбор операторов для обработки объектов в потоке.

В вашем случае вы можете написать getPojo() метод, например:

public Mono<MyPojo> getPojo() {
     return myWebClient.get()
            .uri(generateUrl())
            .headers(createHttpHeaders(headersMap))
            .retrieve()
            .onStatus(status -> webClientUtils.isError(status), 
                      response -> Mono.error(myHttpException(response))
            .bodyToMono(MyPojo.class)
}

Обратите внимание, что, используя метод onStatus, мы заменили весь метод evaluateResponseStatus в вашем примере.

Вы бы использовали этот метод следующим образом:

// some method
...
getPojo()
    .map(pojo -> /* do something with the pojo instance */)
...

Я настоятельно советую вам изучить Преобразование существующей последовательности в документах Project Reactor.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...