они не действуют одинаково, потому что вы не закодировали их одинаково.
Одна из самых распространенных ошибок, которые люди допускают при работе с webflux / реактивным программированием, заключается в том, что они подписываются в середине своих приложений.потому что они хотят или нуждаются в конкретном значении чего-либо.
WebFlux / реактивное программирование в основном заключается в том, что мы объявляем цепочку событий, которые мы хотим, чтобы происходило, когда кто-то подписывается.И в этом случае это когда клиент подписывается.Так что очень приятно, что вы чувствуете, что что-то не так, потому что есть!
Ваша проблема здесь:
public Mono<ServerResponse> getOddIntsMult(ServerRequest request) {
System.out.println("DEBYG -> DemoRequestHandler.getOddIntsMult()");
return ServerResponse.ok()
.contentType(MediaType.APPLICATION_JSON)
.body(BodyInserters.fromObject( // This body inserter here
DemoFlux.getOddInts(DemoFlux.multIntFlux)));
}
Что происходит, когда BodyInserter ожидает конкретное значение, и есливы заглядываете в исходный код, и видите, что тело вставляет тело в моно.То, что вы делаете, это то, что он оборачивает Flux
в Mono
, так что вы, по сути, получаете Mono<Flux<Integer>>
.
После того, как вы поработали некоторое время с webflux, вы можете сказать, что этослучай, когда вы получаете что-то вроде:
{
"disposed": true,
"scanAvailable": true
}
Тогда вы знаете, что получаете упакованный моно / поток и пропустили куда-то плоскую карту.
Если переписать и удалить BodyInserter
он будет работать как положено.
public Mono<ServerResponse> getOddIntsMult(ServerRequest request) {
System.out.println("DEBYG -> DemoRequestHandler.getOddIntsMult()");
return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON)
.body(DemoFlux.getOddInts(DemoFlux.multIntFlux), Integer.class);
}
Таким образом, нет никакой разницы, ваш @RequestMapping(method=GET, value="/v1/fluxMult")
не использует DemoRequestHandler
, следовательно, вы получите другие результаты.