[[spring-web-reactive]] = Web on Reactive Stack :doc-root: https://docs.spring.io :api-spring-framework: {doc-root}/spring-framework/docs/{spring-version}/javadoc-api/org/springframework :toc: left :toclevels: 4 :tabsize: 4 :docinfo1: This part of the documentation covers support for reactive stack, web applications built on a https://www.reactive-streams.org/[Reactive Streams] API to run on non-blocking servers such as Netty, Undertow, and Servlet 3.1+ containers. Individual chapters cover the <> framework, the reactive <>, support for <>, and <>. For Servlet stack, web applications, please see <>. include::web/webflux.adoc[leveloffset=+1] include::web/webflux-webclient.adoc[leveloffset=+1] include::web/webflux-websocket.adoc[leveloffset=+1] [[webflux-test]] == Testing [.small]#<># The `spring-test` module provides mock implementations of `ServerHttpRequest`, `ServerHttpResponse`, and `ServerWebExchange`. See <> mock objects. The <> builds on these mock request and response objects to provide support for testing WebFlux applications without and HTTP server. The `WebTestClient` can be used for end-to-end integration tests too. [[webflux-threading-model]] === Threading model [[webflux-reactive-libraries]] == Reactive Libraries `spring-webflux` depends on `reactor-core` and uses it internally to compose asynchronous logic and to provide Reactive Streams support. Generally WebFlux APIs return `Flux` or `Mono` -- since that's what's used internally, and leniently accept any Reactive Streams `Publisher` implementation as input. The use of `Flux` vs `Mono` is important because it helps to express cardinality -- e.g. whether a single or multiple async values are expected, and that can be essential for making decisions, for example when encoding or decoding HTTP messages. For annotated controllers, WebFlux transparently adapts to the reactive library chosen by the application. This is done with the help of the {api-spring-framework}/core/ReactiveAdapterRegistry.html[ReactiveAdapterRegistry] which provides pluggable support for reactive library and other asynchronous types. The registry has built-in support for RxJava and `CompletableFuture`, but others can be registered too. For functional APIs such as <>, the `WebClient`, and others, the general rules for WebFlux APIs apply -- `Flux` and `Mono` as return values, and Reactive Streams `Publisher` as input. When a `Publisher`, whether custom or from another reactive library, is provided, it can only be treated as a stream with unknown semantics (0..N). If however the semantics are known, you can wrap it with `Flux` or `Mono.from(Publisher)` instead of passing the raw `Publisher`. [NOTE] ==== For example, given a `Publisher` that is not a `Mono`, the Jackson JSON message writer expects multiple values. If the media type implies an infinite stream -- e.g. `"application/json+stream"`, values are written and flushed individually; otherwise values are buffered into a list and rendered as a JSON array. ====