Spring WebFlux switchIfEmpty для возврата другого типа

public Mono<ServerResponse> getMessage(ServerRequest request) {
    //this call returns Mono<ApiClientResponse>
    return apiClient.hystrixWrappedGetMessages(request.headers().asHttpHeaders(), request.queryParams())
            .switchIfEmpty(/* Here */)
}

Извините за немного неполный код, я реструктурировал его, когда столкнулся с этой проблемой. Суть в том, что там, где написано /* Здесь */ в вызове switchIfEmpty(), компилятор принудительно использует тип Mono<ApiClientResponse>, но когда hystrixWrappedGetMessages() возвращает Mono.empty(), я хочу обработать это, возвращая, например, 204 Mono<ServerResponse>, иначе я хочу вернуть 200. Как я могу это сделать?

В идеале я мог бы проверить, был ли это Mono.empty() в вызове карты, но, похоже, он не входит в карту, если это пустой Mono. Думал об использовании дополнительных опций, но они, похоже, не очень хорошо работают с Monos.

Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
Что такое управление транзакциями JDBC и как оно используется для поддержания согласованности данных?
Что такое управление транзакциями JDBC и как оно используется для поддержания согласованности данных?
Управление транзакциями JDBC - это мощная функция, которая позволяет рассматривать группу операций с базой данных как единую единицу работы. Оно...
Выполнение HTTP-запроса с помощью Spring WebClient: GET
Выполнение HTTP-запроса с помощью Spring WebClient: GET
WebClient - это реактивный веб-клиент, представленный в Spring 5. Это реактивное, неблокирующее решение, работающее по протоколу HTTP/1.1.
Gradle за прокси-сервером
Gradle за прокси-сервером
Создайте проект Gradle под сетевым прокси.
2
0
5 285
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны иметь возможность flatMap свой ответ, если он хороший, и если Mono#empty возвращается, flatMap будет проигнорирован.

public Mono<ServerResponse> getMessage(ServerRequest request) {
    return apiClient.hystrixWrappedGetMessages(request.headers().asHttpHeaders(), request.queryParams())
        .flatMap(response -> {
            // Do your processing here
            return ServerResponse.ok().body( .... );
        }.switchIfEmpty(ServerResponse.noContent());
}

Ах, я думаю, чего мне не хватало в моем понимании, так это того, как он проваливается в цепочку. Спасибо за ответ

Will M. 18.12.2020 19:37

Другие вопросы по теме