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

#java #reactive-programming #spring-webflux #spring-webclient #reactor-netty

#java #реактивное программирование #spring-webflux #spring-webclient #реактор-сеть

Вопрос:

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

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

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

Ответ №1:

Вы должны быть в состоянии flatMap ответить, если это хорошо, и если an 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());
}
 

Комментарии:

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