Как проверить объект ответа в Spring WebClient

Я использую веб-клиент Springs для вызова HTTP GET.

Как я могу проверить свойство объекта ответа GetPersonBasicInfoResWrapper, которое я получил в ответ на свой HTTP-вызов.

Я пытаюсь проверить birthDate внутри flatMap, блокируя объект ответа, но это не похоже на наиболее функциональный способ сделать это.

Ниже приводится отрывок из моего кода.

private Mono<GetPersonBasicInfoResWrapper> getPersonBasicInfo(Double personId, LocalDate birthDate,
            CallerRequestMetaData callerInfo) {
        return middlewareWebClient
                .get()
                .uri(...)
                ...
                ...
                .exchange()
                .flatMap(client -> {
                    GetPersonBasicInfoResWrapper block = client.bodyToMono(GetPersonBasicInfoResWrapper.class).block();
                    LocalDate personBirthDate = LocalDateTime.ofInstant(block.getBirthDate().toInstant(),ZoneId.of(Constants.DEFAULT_TIME_ZOME)).toLocalDate();
                    if (!personBirthDate.equals(birthDate)) { 
                        throw new YakeenRowadException(Errors.INCORRECT_ID_BIRTH_DATE_G, birthDate.toString()); 
                    } else
                        return client.bodyToMono(GetPersonBasicInfoResWrapper.class);
                });
}

Любая помощь высоко ценится.


person Abdullah Khan    schedule 30.03.2020    source источник
comment
не block() в коде, вы потеряете всякую цель использования webflux, если заблокируете. Сначала верните Mono<GetPersonBasicInfoResWrapper>, затем подтвердите, вызвав Mono<GetPersonBasicInfoResWrapper>#flatMap   -  person Toerktumlare    schedule 30.03.2020
comment
@ThomasAndolf Именно так! Я тоже не хочу блокировать, но я не уверен, как реализовать проверку неблокирующим способом. не могли бы вы опубликовать код, пожалуйста.   -  person Abdullah Khan    schedule 30.03.2020


Ответы (1)


Попробуйте что-то вроде этого

private Mono<PersonInfo> getPersonInfo(Double personId) {
    return webClient.get()
            .uri(...)
            .exchange()
            .flatMap(response -> {
                return response.bodyToMono(PersonInfo.class);
            });
}

private LocalDate toLocalDate(Instant instant) {
    return LocalDateTime.ofInstant(instant, ZoneId.of(Constants.DEFAULT_TIME_ZOME))
                        .toLocalDate();
}

public Mono<PersonInfo> doSomething(Double personId, LocalDate birthDate) {
    return getPersonInfo(personId)
             .flatMap(personInfo -> {
                final LocalDate birthDate = toLocalDate(personInfo.getBirthDate().toInstant());
                if (!personBirthDate.equals(birthDate)) { 
                    return Mono.error(new YakeenRowadException(Errors.INCORRECT_ID_BIRTH_DATE_G, birthDate.toString()));
                }
                return Mono.just(personInfo);
            });
}

Не проверяйте во время выборки, проверка - это бизнес-логика, и она должна быть на уровне выше.

  1. ты забираешь и возвращаешь
  2. вы подтверждаете.
  3. Если проверка не удалась, вы возвращаете Mono.error () вызывающему клиенту.

Я понятия не имею, что должны были быть «Метаданные». Надеюсь, это не URL-адрес, потому что передавать его таким образом неправильно.

(старайтесь избегать подробных имен)

person Toerktumlare    schedule 30.03.2020
comment
Это кажется полезным. Я протестирую и дам знать !! Спасибо - person Abdullah Khan; 31.03.2020
comment
Также, исходя из OOPs фона, очень сложно понять эту функциональную парадигму. Вы видите этот return метод в первой строке вызова метода. Однако мне нравится эта новая парадигма. - person Abdullah Khan; 31.03.2020