#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. Ах, я думаю, чего мне не хватало в моем понимании, так это того, как он проходит через цепочку. Спасибо за ответ