General doc revision: configuration updates, consistent formatting etc
This commit is contained in:
@@ -1,16 +1,16 @@
|
||||
[[web-integration]]
|
||||
= Other Web Frameworks
|
||||
|
||||
This chapter details Spring's integration with third party web frameworks.
|
||||
This chapter details Spring's integration with third-party web frameworks.
|
||||
|
||||
One of the core value propositions of the Spring Framework is that of enabling
|
||||
_choice_. In a general sense, Spring does not force you to use or buy into any
|
||||
particular architecture, technology, or methodology (although it certainly recommends
|
||||
some over others). This freedom to pick and choose the architecture, technology, or
|
||||
methodology that is most relevant to a developer and their development team is
|
||||
arguably most evident in the web area, where Spring provides its own web framework
|
||||
(<<mvc,Spring MVC>>) while, at the same time, providing integration with a number of
|
||||
popular third party web frameworks.
|
||||
arguably most evident in the web area, where Spring provides its own web frameworks
|
||||
(<<mvc, Spring MVC>> and <<webflux, Spring WebFlux>>) while, at the same time,
|
||||
supporting integration with a number of popular third-party web frameworks.
|
||||
|
||||
|
||||
|
||||
@@ -19,9 +19,8 @@ popular third party web frameworks.
|
||||
== Common Configuration
|
||||
|
||||
Before diving into the integration specifics of each supported web framework, let us
|
||||
first take a look at the Spring configuration that is not specific to any one web
|
||||
framework. (This section is equally applicable to Spring's own web framework, Spring
|
||||
MVC.)
|
||||
first take a look at common Spring configuration that is not specific to any one web
|
||||
framework. (This section is equally applicable to Spring's own web framework variants.)
|
||||
|
||||
One of the concepts (for want of a better word) espoused by Spring's lightweight
|
||||
application model is that of a layered architecture. Remember that in a "`classic`"
|
||||
@@ -96,14 +95,14 @@ key. Rather than risk getting `NullPointerExceptions` in your application, it is
|
||||
to use the `getRequiredWebApplicationContext()` method. This method throws an exception
|
||||
when the `ApplicationContext` is missing.
|
||||
|
||||
Once you have a reference to the `WebApplicationContext`, you can retrieve beans by
|
||||
their name or type. Most developers retrieve beans by name and then cast them to one of
|
||||
their implemented interfaces.
|
||||
Once you have a reference to the `WebApplicationContext`, you can retrieve beans by their
|
||||
name or type. Most developers retrieve beans by name and then cast them to one of their
|
||||
implemented interfaces.
|
||||
|
||||
Fortunately, most of the frameworks in this section have simpler ways of looking up
|
||||
beans. Not only do they make it easy to get beans from a Spring container, but they also
|
||||
let you use dependency injection on their controllers. Each web framework section
|
||||
has more detail on its specific integration strategies.
|
||||
Fortunately, most of the frameworks in this section have simpler ways of looking up beans.
|
||||
Not only do they make it easy to get beans from a Spring container, but they also let you
|
||||
use dependency injection on their controllers. Each web framework section has more detail
|
||||
on its specific integration strategies.
|
||||
|
||||
|
||||
|
||||
@@ -111,18 +110,14 @@ has more detail on its specific integration strategies.
|
||||
[[jsf]]
|
||||
== JSF
|
||||
|
||||
JavaServer Faces (JSF) is the JCP's standard component-based, event-driven web user
|
||||
interface framework. As of Java EE 5, it is an official part of the Java EE umbrella.
|
||||
JavaServer Faces (JSF) is the JCP's standard component-based, event-driven web
|
||||
user interface framework. It is an official part of the Java EE umbrella but also
|
||||
individually usable, e.g. through embedding Mojarra or MyFaces within Tomcat.
|
||||
|
||||
For a popular JSF runtime as well as for popular JSF component libraries, check out the
|
||||
http://myfaces.apache.org/[Apache MyFaces project]. The MyFaces project also provides
|
||||
common JSF extensions, such as http://myfaces.apache.org/orchestra/[MyFaces Orchestra]
|
||||
(a Spring-based JSF extension that provides rich conversation scope support).
|
||||
|
||||
NOTE: Spring Web Flow 2.0 provides rich JSF support through its newly established Spring Faces
|
||||
module, both for JSF-centric usage (as described in this section) and for Spring-centric
|
||||
usage (using JSF views within a Spring MVC dispatcher). See the
|
||||
http://projects.spring.io/spring-webflow[Spring Web Flow website] for details.
|
||||
Please note that recent versions of JSF became closely tied to CDI infrastructure
|
||||
in application servers, with some new JSF functionality only working in such an
|
||||
environment. Spring's JSF support is not actively evolved anymore and primarily
|
||||
exists for migration purposes when modernizing older JSF-based applications.
|
||||
|
||||
The key element in Spring's JSF integration is the JSF `ELResolver` mechanism.
|
||||
|
||||
@@ -131,11 +126,10 @@ The key element in Spring's JSF integration is the JSF `ELResolver` mechanism.
|
||||
[[jsf-springbeanfaceselresolver]]
|
||||
=== Spring Bean Resolver
|
||||
|
||||
`SpringBeanFacesELResolver` is a JSF 1.2+ compliant `ELResolver` implementation,
|
||||
integrating with the standard Unified EL as used by JSF 1.2 and JSP 2.1. As
|
||||
`SpringBeanVariableResolver`, it delegates to Spring's "`business context`"
|
||||
`WebApplicationContext` first and then to the default resolver of the underlying JSF
|
||||
implementation.
|
||||
`SpringBeanFacesELResolver` is a JSF compliant `ELResolver` implementation,
|
||||
integrating with the standard Unified EL as used by JSF and JSP. It delegates to
|
||||
Spring's "`business context`" `WebApplicationContext` first and then to the
|
||||
default resolver of the underlying JSF implementation.
|
||||
|
||||
Configuration-wise, you can define `SpringBeanFacesELResolver` in your JSF
|
||||
`faces-context.xml` file, as the following example shows:
|
||||
@@ -158,11 +152,11 @@ Configuration-wise, you can define `SpringBeanFacesELResolver` in your JSF
|
||||
[[jsf-facescontextutils]]
|
||||
=== Using `FacesContextUtils`
|
||||
|
||||
A custom `VariableResolver` works well when mapping your properties to beans
|
||||
in `faces-config.xml`, but, at times, you may need to explicitly grab a bean. The
|
||||
{api-spring-framework}/web/jsf/FacesContextUtils.html[`FacesContextUtils`]
|
||||
class makes this easy. It is similar to `WebApplicationContextUtils`, except that it
|
||||
takes a `FacesContext` parameter rather than a `ServletContext` parameter.
|
||||
A custom `ELResolver` works well when mapping your properties to beans in
|
||||
`faces-config.xml`, but, at times, you may need to explicitly grab a bean.
|
||||
The {api-spring-framework}/web/jsf/FacesContextUtils.html[`FacesContextUtils`]
|
||||
class makes this easy. It is similar to `WebApplicationContextUtils`, except that
|
||||
it takes a `FacesContext` parameter rather than a `ServletContext` parameter.
|
||||
|
||||
The following example shows how to use `FacesContextUtils`:
|
||||
|
||||
@@ -183,30 +177,29 @@ The following example shows how to use `FacesContextUtils`:
|
||||
Invented by Craig McClanahan, http://struts.apache.org[Struts] is an open-source project
|
||||
hosted by the Apache Software Foundation. At the time, it greatly simplified the
|
||||
JSP/Servlet programming paradigm and won over many developers who were using proprietary
|
||||
frameworks. It simplified the programming model, it was open source (and thus free, as in
|
||||
beer), and it had a large community, which let the project grow and become popular
|
||||
among Java web developers.
|
||||
frameworks. It simplified the programming model, it was open source (and thus free as in
|
||||
beer), and it had a large community, which let the project grow and become popular among
|
||||
Java web developers.
|
||||
|
||||
Check out the Struts
|
||||
As a successor to the original Struts 1.x, check out Struts 2.x and the Struts-provided
|
||||
https://struts.apache.org/release/2.3.x/docs/spring-plugin.html[Spring Plugin] for the
|
||||
built-in Spring integration shipped with Struts.
|
||||
built-in Spring integration.
|
||||
|
||||
|
||||
|
||||
|
||||
[[tapestry]]
|
||||
== Tapestry 5.x
|
||||
== Apache Tapestry 5.x
|
||||
|
||||
http://tapestry.apache.org/[Tapestry] is a ""Component oriented framework for creating dynamic, robust,
|
||||
highly scalable web applications in Java.""
|
||||
http://tapestry.apache.org/[Tapestry] is a ""Component oriented framework for creating
|
||||
dynamic, robust, highly scalable web applications in Java.""
|
||||
|
||||
While Spring has its own <<mvc,powerful web layer>>, there are a number of unique
|
||||
While Spring has its own <<mvc, powerful web layer>>, there are a number of unique
|
||||
advantages to building an enterprise Java application by using a combination of Tapestry
|
||||
for the web user interface and the Spring container for the lower layers.
|
||||
|
||||
For more information, see Tapestry's dedicated
|
||||
https://tapestry.apache.org/integrating-with-spring-framework.html[integration module for
|
||||
Spring].
|
||||
https://tapestry.apache.org/integrating-with-spring-framework.html[integration module for Spring].
|
||||
|
||||
|
||||
|
||||
@@ -214,8 +207,8 @@ Spring].
|
||||
[[web-integration-resources]]
|
||||
== Further Resources
|
||||
|
||||
The following links go to further resources about the various web frameworks described in this
|
||||
chapter.
|
||||
The following links go to further resources about the various web frameworks described in
|
||||
this chapter.
|
||||
|
||||
* The http://www.oracle.com/technetwork/java/javaee/javaserverfaces-139869.html[JSF] homepage
|
||||
* The http://struts.apache.org/[Struts] homepage
|
||||
|
||||
@@ -71,10 +71,10 @@ You shorter it further still with a full URI template, as the following example
|
||||
= UriBuilder
|
||||
[.small]#Spring MVC and Spring WebFlux#
|
||||
|
||||
<<web-uricomponents,`UriComponentsBuilder`>> implements `UriBuilder`. You can create a `UriBuilder`, in turn,
|
||||
with a `UriBuilderFactory`. Together, `UriBuilderFactory` and `UriBuilder`
|
||||
provide a pluggable mechanism to build URIs from URI templates, based on shared
|
||||
configuration, such as a base URL, encoding preferences, and other details.
|
||||
<<web-uricomponents, `UriComponentsBuilder`>> implements `UriBuilder`. You can create a
|
||||
`UriBuilder`, in turn, with a `UriBuilderFactory`. Together, `UriBuilderFactory` and
|
||||
`UriBuilder` provide a pluggable mechanism to build URIs from URI templates, based on
|
||||
shared configuration, such as a base URL, encoding preferences, and other details.
|
||||
|
||||
You can configure `RestTemplate` and `WebClient` with a `UriBuilderFactory`
|
||||
to customize the preparation of URIs. `DefaultUriBuilderFactory` is a default
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[[webflux-cors]]
|
||||
= CORS
|
||||
[.small]#<<web.adoc#mvc-cors,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-cors, Same as in Spring MVC>>#
|
||||
|
||||
Spring WebFlux lets you handle CORS (Cross-Origin Resource Sharing). This section
|
||||
describes how to do so.
|
||||
@@ -10,7 +10,7 @@ describes how to do so.
|
||||
|
||||
[[webflux-cors-intro]]
|
||||
== Introduction
|
||||
[.small]#<<web.adoc#mvc-cors-intro,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-cors-intro, Same as in Spring MVC>>#
|
||||
|
||||
For security reasons, browsers prohibit AJAX calls to resources outside the current origin.
|
||||
For example, you could have your bank account in one tab and evil.com in another. Scripts
|
||||
@@ -27,7 +27,7 @@ powerful workarounds based on IFRAME or JSONP.
|
||||
|
||||
[[webflux-cors-processing]]
|
||||
== Processing
|
||||
[.small]#<<web.adoc#mvc-cors-processing,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-cors-processing, Same as in Spring MVC>>#
|
||||
|
||||
The CORS specification distinguishes between preflight, simple, and actual requests.
|
||||
To learn how CORS works, you can read
|
||||
@@ -77,7 +77,7 @@ To learn more from the source or to make advanced customizations, see:
|
||||
|
||||
[[webflux-cors-controller]]
|
||||
== `@CrossOrigin`
|
||||
[.small]#<<web.adoc#mvc-cors-controller,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-cors-controller, Same as in Spring MVC>>#
|
||||
|
||||
The {api-spring-framework}/web/bind/annotation/CrossOrigin.html[`@CrossOrigin`]
|
||||
annotation enables cross-origin requests on annotated controller methods, as the
|
||||
@@ -176,7 +176,7 @@ public class AccountController {
|
||||
|
||||
[[webflux-cors-global]]
|
||||
== Global Configuration
|
||||
[.small]#<<web.adoc#mvc-cors-global,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-cors-global, Same as in Spring MVC>>#
|
||||
|
||||
In addition to fine-grained, controller method-level configuration, you probably want to
|
||||
define some global CORS configuration, too. You can set URL-based `CorsConfiguration`
|
||||
@@ -227,11 +227,11 @@ public class WebConfig implements WebFluxConfigurer {
|
||||
|
||||
[[webflux-cors-webfilter]]
|
||||
== CORS `WebFilter`
|
||||
[.small]#<<web.adoc#mvc-cors-filter,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-cors-filter, Same as in Spring MVC>>#
|
||||
|
||||
You can apply CORS support through the built-in
|
||||
{api-spring-framework}/web/cors/reactive/CorsWebFilter.html[`CorsWebFilter`], which is a
|
||||
good fit with <<webflux-fn,functional endpoints>>.
|
||||
good fit with <<webflux-fn, functional endpoints>>.
|
||||
|
||||
NOTE: If you try to use the `CorsFilter` with Spring Security, keep in mind that Spring
|
||||
Security has
|
||||
|
||||
@@ -66,7 +66,7 @@ public class PersonHandler {
|
||||
====
|
||||
|
||||
One way to run a `RouterFunction` is to turn it into an `HttpHandler` and install it
|
||||
through one of the built-in <<web-reactive.adoc#webflux-httphandler,server adapters>>:
|
||||
through one of the built-in <<web-reactive.adoc#webflux-httphandler, server adapters>>:
|
||||
|
||||
* `RouterFunctions.toHttpHandler(RouterFunction)`
|
||||
* `RouterFunctions.toHttpHandler(RouterFunction, HandlerStrategies)`
|
||||
@@ -85,7 +85,7 @@ Both request and response provide http://www.reactive-streams.org[Reactive Strea
|
||||
against the body streams.
|
||||
The request body is represented with a Reactor `Flux` or `Mono`.
|
||||
The response body is represented with any Reactive Streams `Publisher`, including `Flux` and `Mono`.
|
||||
For more on that, see <<web-reactive.adoc#webflux-reactive-libraries,Reactive Libraries>>.
|
||||
For more on that, see <<web-reactive.adoc#webflux-reactive-libraries, Reactive Libraries>>.
|
||||
|
||||
|
||||
|
||||
@@ -255,9 +255,9 @@ found. If it is not found, we use `switchIfEmpty(Mono<T>)` to return a 404 Not F
|
||||
[[webflux-fn-handler-validation]]
|
||||
=== Validation
|
||||
|
||||
A functional endpoint can use Spring's <<core.adoc#validation,validation facilities>> to
|
||||
A functional endpoint can use Spring's <<core.adoc#validation, validation facilities>> to
|
||||
apply validation to the request body. For example, given a custom Spring
|
||||
<<core.adoc#validation,Validator>> implementation for a `Person`:
|
||||
<<core.adoc#validation, Validator>> implementation for a `Person`:
|
||||
|
||||
====
|
||||
[source,java,indent=0]
|
||||
@@ -290,7 +290,7 @@ public class PersonHandler {
|
||||
|
||||
Handlers can also use the standard bean validation API (JSR-303) by creating and injecting
|
||||
a global `Validator` instance based on `LocalValidatorFactoryBean`.
|
||||
See <<core.adoc#validation-beanvalidation,Spring Validation>>.
|
||||
See <<core.adoc#validation-beanvalidation, Spring Validation>>.
|
||||
|
||||
|
||||
|
||||
@@ -454,10 +454,10 @@ function to an `HttpHandler` by using one of the following:
|
||||
* `RouterFunctions.toHttpHandler(RouterFunction, HandlerStrategies)`
|
||||
|
||||
You can then use the returned `HttpHandler` with a number of server adapters by following
|
||||
<<web-reactive.adoc#webflux-httphandler,HttpHandler>> for server-specific instructions.
|
||||
<<web-reactive.adoc#webflux-httphandler, HttpHandler>> for server-specific instructions.
|
||||
|
||||
A more typical option, also used by Spring Boot, is to run with a
|
||||
<<web-reactive.adoc#webflux-dispatcher-handler,`DispatcherHandler`>>-based setup through the
|
||||
<<web-reactive.adoc#webflux-dispatcher-handler, `DispatcherHandler`>>-based setup through the
|
||||
<<web-reactive.adoc#webflux-config>>, which uses Spring configuration to declare the
|
||||
components required to process requests. The WebFlux Java configuration declares the following
|
||||
infrastructure components to support functional endpoints:
|
||||
@@ -476,7 +476,7 @@ any are declared. It is also how functional endpoints are enabled by the Spring
|
||||
starter.
|
||||
|
||||
The following example shows a WebFlux Java configuration (see
|
||||
<<web-reactive.adoc#webflux-dispatcher-handler,DispatcherHandler>> for how to run it):
|
||||
<<web-reactive.adoc#webflux-dispatcher-handler, DispatcherHandler>> for how to run it):
|
||||
|
||||
====
|
||||
[source,java,indent=0]
|
||||
@@ -590,4 +590,5 @@ We allow only the handler function to be executed when access is allowed.
|
||||
Besides using the `filter` method on the router function builder, it is possible to apply a
|
||||
filter to an existing router function via `RouterFunction.filter(HandlerFilterFunction)`.
|
||||
|
||||
NOTE: CORS support for functional endpoints is provided through a dedicated <<webflux-cors-webfilter,`CorsWebFilter`>>.
|
||||
NOTE: CORS support for functional endpoints is provided through a dedicated
|
||||
<<webflux-cors-webfilter, `CorsWebFilter`>>.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[[webflux-view]]
|
||||
= View Technologies
|
||||
[.small]#<<web.adoc#mvc-view,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-view, Same as in Spring MVC>>#
|
||||
|
||||
The use of view technologies in Spring WebFlux is pluggable. Whether you decide to
|
||||
use Thymeleaf, FreeMarker, or some other view technology is primarily a matter of a
|
||||
@@ -12,7 +12,7 @@ WebFlux. We assume you are already familiar with <<webflux-viewresolution>>.
|
||||
|
||||
[[webflux-view-thymeleaf]]
|
||||
== Thymeleaf
|
||||
[.small]#<<web.adoc#mvc-view-thymeleaf,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-view-thymeleaf, Same as in Spring MVC>>#
|
||||
|
||||
Thymeleaf is a modern server-side Java template engine that emphasizes natural HTML
|
||||
templates that can be previewed in a browser by double-clicking, which is very
|
||||
@@ -33,7 +33,7 @@ http://forum.thymeleaf.org/Thymeleaf-3-0-8-JUST-PUBLISHED-td4030687.html[announc
|
||||
|
||||
[[webflux-view-freemarker]]
|
||||
== FreeMarker
|
||||
[.small]#<<web.adoc#mvc-view-freemarker,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-view-freemarker, Same as in Spring MVC>>#
|
||||
|
||||
http://www.freemarker.org[Apache FreeMarker] is a template engine for generating any
|
||||
kind of text output from HTML to email and others. The Spring Framework has a built-in
|
||||
@@ -43,7 +43,7 @@ integration for using Spring WebFlux with FreeMarker templates.
|
||||
|
||||
[[webflux-view-freemarker-contextconfig]]
|
||||
=== View Configuration
|
||||
[.small]#<<web.adoc#mvc-view-freemarker-contextconfig,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-view-freemarker-contextconfig, Same as in Spring MVC>>#
|
||||
|
||||
The following example shows how to configure FreeMarker as a view technology:
|
||||
|
||||
@@ -81,7 +81,7 @@ shown in the preceding example. Given the preceding configuration, if your contr
|
||||
|
||||
[[webflux-views-freemarker]]
|
||||
=== FreeMarker Configuration
|
||||
[.small]#<<web.adoc#mvc-views-freemarker,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-views-freemarker, Same as in Spring MVC>>#
|
||||
|
||||
You can pass FreeMarker 'Settings' and 'SharedVariables' directly to the FreeMarker
|
||||
`Configuration` object (managed by Spring) by setting the appropriate bean properties on
|
||||
@@ -121,7 +121,7 @@ the `Configuration` object.
|
||||
|
||||
[[webflux-view-script]]
|
||||
== Script Views
|
||||
[.small]#<<web.adoc#mvc-view-script,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-view-script, Same as in Spring MVC>>#
|
||||
|
||||
The Spring Framework has a built-in integration for using Spring WebFlux with any
|
||||
templating library that can run on top of the
|
||||
@@ -147,7 +147,7 @@ TIP: The basic rule for integrating any other script engine is that it must impl
|
||||
|
||||
[[webflux-view-script-dependencies]]
|
||||
=== Requirements
|
||||
[.small]#<<web.adoc#mvc-view-script-dependencies,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-view-script-dependencies, Same as in Spring MVC>>#
|
||||
|
||||
You need to have the script engine on your classpath, the details of which vary by script engine:
|
||||
|
||||
@@ -167,7 +167,7 @@ through http://www.webjars.org/[WebJars].
|
||||
|
||||
[[webflux-view-script-integrate]]
|
||||
=== Script Templates
|
||||
[.small]#<<web.adoc#mvc-view-script-integrate,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-view-script-integrate, Same as in Spring MVC>>#
|
||||
|
||||
You can declare a `ScriptTemplateConfigurer` bean to specify the script engine to use,
|
||||
the script files to load, what function to call to render templates, and so on.
|
||||
@@ -286,20 +286,20 @@ for more configuration examples.
|
||||
|
||||
[[webflux-view-httpmessagewriter]]
|
||||
== JSON and XML
|
||||
[.small]#<<web.adoc#mvc-view-jackson,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-view-jackson, Same as in Spring MVC>>#
|
||||
|
||||
For <<webflux-multiple-representations>> purposes, it is useful to be able to alternate
|
||||
between rendering a model with an HTML template or as other formats (such as JSON or XML),
|
||||
depending on the content type requested by the client. To support doing so, Spring WebFlux
|
||||
provides the `HttpMessageWriterView`, which you can use to plug in any of the available
|
||||
<<webflux-codecs>> from `spring-web`, such as `Jackson2JsonEncoder`,
|
||||
`Jackson2SmileEncoder`, or `Jaxb2XmlEncoder`.
|
||||
<<webflux-codecs>> from `spring-web`, such as `Jackson2JsonEncoder`, `Jackson2SmileEncoder`,
|
||||
or `Jaxb2XmlEncoder`.
|
||||
|
||||
Unlike other view technologies, `HttpMessageWriterView` does not require a `ViewResolver`
|
||||
but is instead <<webflux-config-view-resolvers,configured>> as a default view. You can
|
||||
configure one or more such default views, wrapping different `HttpMessageWriter` instances or
|
||||
`Encoder` instances. The one that matches the requested content type is used at runtime.
|
||||
but is instead <<webflux-config-view-resolvers, configured>> as a default view. You can
|
||||
configure one or more such default views, wrapping different `HttpMessageWriter` instances
|
||||
or `Encoder` instances. The one that matches the requested content type is used at runtime.
|
||||
|
||||
In most cases, a model contains multiple attributes. To determine which one
|
||||
to serialize, you can configure `HttpMessageWriterView` with the name of the model
|
||||
attribute to use for rendering. If the model contains only one attribute, that one is used.
|
||||
In most cases, a model contains multiple attributes. To determine which one to serialize,
|
||||
you can configure `HttpMessageWriterView` with the name of the model attribute to use for
|
||||
rendering. If the model contains only one attribute, that one is used.
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
Spring WebFlux includes a reactive, non-blocking `WebClient` for HTTP requests. The client
|
||||
has a functional, fluent API with reactive types for declarative composition, see
|
||||
<<web-reactive.adoc#webflux-reactive-libraries>>. WebFlux client and server rely on the
|
||||
same non-blocking <<web-reactive.adoc#webflux-codecs,codecs>> to encode and decode request
|
||||
same non-blocking <<web-reactive.adoc#webflux-codecs, codecs>> to encode and decode request
|
||||
and response content.
|
||||
|
||||
Internally `WebClient` delegates to an HTTP client library. By default, it uses
|
||||
@@ -36,7 +36,7 @@ You can also use `WebClient.builder()` with further options:
|
||||
* `exchangeStrategies`: HTTP message reader/writer customizations.
|
||||
* `clientConnector`: HTTP client library settings.
|
||||
|
||||
The following example configures <<web-reactive.adoc#webflux-codecs,HTTP codecs>>:
|
||||
The following example configures <<web-reactive.adoc#webflux-codecs, HTTP codecs>>:
|
||||
|
||||
====
|
||||
[source,java,intent=0]
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[[webflux-websocket]]
|
||||
= WebSockets
|
||||
[.small]#<<web.adoc#websocket,Same as in the Servlet stack>>#
|
||||
[.small]#<<web.adoc#websocket, Same as in the Servlet stack>>#
|
||||
|
||||
This part of the reference documentation covers support for reactive-stack WebSocket
|
||||
messaging.
|
||||
@@ -12,7 +12,7 @@ include::websocket-intro.adoc[leveloffset=+1]
|
||||
|
||||
[[webflux-websocket-server]]
|
||||
== WebSocket API
|
||||
[.small]#<<web.adoc#websocket-server,Same as in the Servlet stack>>#
|
||||
[.small]#<<web.adoc#websocket-server, Same as in the Servlet stack>>#
|
||||
|
||||
The Spring Framework provides a WebSocket API that you can use to write client- and
|
||||
server-side applications that handle WebSocket messages.
|
||||
@@ -21,7 +21,7 @@ server-side applications that handle WebSocket messages.
|
||||
|
||||
[[webflux-websocket-server-handler]]
|
||||
=== Server
|
||||
[.small]#<<web.adoc#websocket-server-handler,Same as in the Servlet stack>>#
|
||||
[.small]#<<web.adoc#websocket-server-handler, Same as in the Servlet stack>>#
|
||||
|
||||
To create a WebSocket server, you can first create a `WebSocketHandler`.
|
||||
The following example shows how to do so:
|
||||
@@ -138,7 +138,7 @@ class ExampleHandler implements WebSocketHandler {
|
||||
TIP: For nested, asynchronous operations, you may need to call `message.retain()` on underlying
|
||||
servers that use pooled data buffers (for example, Netty). Otherwise, the data buffer may be
|
||||
released before you have had a chance to read the data. For more background, see
|
||||
<<core.adoc#databuffers,Data Buffers and Codecs>>.
|
||||
<<core.adoc#databuffers, Data Buffers and Codecs>>.
|
||||
|
||||
The following implementation combines the inbound and outbound streams:
|
||||
|
||||
@@ -209,7 +209,7 @@ class ExampleHandler implements WebSocketHandler {
|
||||
|
||||
`DataBuffer` is the representation for a byte buffer in WebFlux. The Spring Core part of
|
||||
the reference has more on that in the section on
|
||||
<<core#databuffers,Data Buffers and Codecs>>. The key point to understand is that on some
|
||||
<<core#databuffers, Data Buffers and Codecs>>. The key point to understand is that on some
|
||||
servers like Netty, byte buffers are pooled and reference counted, and must be released
|
||||
when consumed to avoid memory leaks.
|
||||
|
||||
@@ -222,7 +222,7 @@ subsequently use `DataBufferUtils.release(dataBuffer)` when the buffers are cons
|
||||
|
||||
[[webflux-websocket-server-handshake]]
|
||||
=== Handshake
|
||||
[.small]#<<web.adoc#websocket-server-handshake,Same as in the Servlet stack>>#
|
||||
[.small]#<<web.adoc#websocket-server-handshake, Same as in the Servlet stack>>#
|
||||
|
||||
`WebSocketHandlerAdapter` delegates to a `WebSocketService`. By default, that is an instance
|
||||
of `HandshakeWebSocketService`, which performs basic checks on the WebSocket request and
|
||||
@@ -237,7 +237,7 @@ into the attributes of the `WebSocketSession`.
|
||||
|
||||
[[webflux-websocket-server-config]]
|
||||
=== Server Configation
|
||||
[.small]#<<web.adoc#websocket-server-runtime-configuration,Same as in the Servlet stack>>#
|
||||
[.small]#<<web.adoc#websocket-server-runtime-configuration, Same as in the Servlet stack>>#
|
||||
|
||||
The `RequestUpgradeStrategy` for each server exposes WebSocket-related configuration
|
||||
options available for the underlying WebSocket engine. The following example sets
|
||||
@@ -272,7 +272,7 @@ only Tomcat and Jetty expose such options.
|
||||
|
||||
[[webflux-websocket-server-cors]]
|
||||
=== CORS
|
||||
[.small]#<<web.adoc#websocket-server-allowed-origins,Same as in the Servlet stack>>#
|
||||
[.small]#<<web.adoc#websocket-server-allowed-origins, Same as in the Servlet stack>>#
|
||||
|
||||
The easiest way to configure CORS and restrict access to a WebSocket endpoint is to
|
||||
have your `WebSocketHandler` implement `CorsConfigurationSource` and return a
|
||||
|
||||
@@ -107,8 +107,8 @@ of RxJava or another reactive library. See <<webflux-reactive-libraries>> for mo
|
||||
=== Programming Models
|
||||
|
||||
The `spring-web` module contains the reactive foundation that underlies Spring WebFlux,
|
||||
including HTTP abstractions, Reactive Streams <<webflux-httphandler,adapters>> for supported
|
||||
servers, <<webflux-codecs,codecs>>, and a core <<webflux-web-handler-api>> comparable to
|
||||
including HTTP abstractions, Reactive Streams <<webflux-httphandler, adapters>> for supported
|
||||
servers, <<webflux-codecs, codecs>>, and a core <<webflux-web-handler-api>> comparable to
|
||||
the Servlet API but with non-blocking contracts.
|
||||
|
||||
On that foundation, Spring WebFlux provides a choice of two programming models:
|
||||
@@ -167,7 +167,7 @@ RxJava to perform blocking calls on a separate thread but you would not be makin
|
||||
most of a non-blocking web stack.
|
||||
|
||||
* If you have a Spring MVC application with calls to remote services, try the reactive `WebClient`.
|
||||
You can return reactive types (Reactor, RxJava, <<webflux-reactive-libraries,or other>>)
|
||||
You can return reactive types (Reactor, RxJava, <<webflux-reactive-libraries, or other>>)
|
||||
directly from Spring MVC controller methods. The greater the latency per call or the
|
||||
interdependency among calls, the more dramatic the benefits. Spring MVC controllers
|
||||
can call other reactive components too.
|
||||
@@ -186,12 +186,12 @@ unsure what benefits to look for, start by learning about how non-blocking I/O w
|
||||
|
||||
Spring WebFlux is supported on Tomcat, Jetty, Servlet 3.1+ containers, as well as on
|
||||
non-Servlet runtimes such as Netty and Undertow. All servers are adapted to a low-level,
|
||||
<<webflux-httphandler,common API>> so that higher-level
|
||||
<<webflux-programming-models,programming models>> can be supported across servers.
|
||||
<<webflux-httphandler, common API>> so that higher-level
|
||||
<<webflux-programming-models, programming models>> can be supported across servers.
|
||||
|
||||
Spring WebFlux does not have built-in support to start or stop a server. However, it is
|
||||
easy to <<webflux-web-handler-api,assemble>> an application from Spring configuration and
|
||||
<<webflux-config,WebFlux infrastructure>> and <<webflux-httphandler,run it>> with a few
|
||||
easy to <<webflux-web-handler-api, assemble>> an application from Spring configuration and
|
||||
<<webflux-config, WebFlux infrastructure>> and <<webflux-httphandler, run it>> with a few
|
||||
lines of code.
|
||||
|
||||
Spring Boot has a WebFlux starter that automates these steps. By default, the starter uses
|
||||
@@ -284,11 +284,11 @@ of their own.
|
||||
|
||||
.Configuring
|
||||
The Spring Framework does not provide support for starting and stopping
|
||||
<<webflux-server-choice,servers>>. To configure the threading model for a server, you
|
||||
need to use server-specific configuration APIs, or, if you use Spring Boot, check the Spring
|
||||
Boot configuration options for each server. You can <<web-reactive.adoc#webflux-client-builder,configure>> The `WebClient`
|
||||
directly. For all other
|
||||
libraries, see their respective documentation.
|
||||
<<webflux-server-choice, servers>>. To configure the threading model for a server,
|
||||
you need to use server-specific configuration APIs, or, if you use Spring Boot,
|
||||
check the Spring Boot configuration options for each server. You can
|
||||
<<web-reactive.adoc#webflux-client-builder, configure>> the `WebClient` directly.
|
||||
For all other libraries, see their respective documentation.
|
||||
|
||||
|
||||
|
||||
@@ -300,7 +300,7 @@ The `spring-web` module contains the following foundational support for reactive
|
||||
applications:
|
||||
|
||||
* For server request processing there are two levels of support.
|
||||
** <<webflux-httphandler,HttpHandler>>: Basic contract for HTTP request handling with
|
||||
** <<webflux-httphandler, HttpHandler>>: Basic contract for HTTP request handling with
|
||||
non-blocking I/O and Reactive Streams back pressure, along with adapters for Reactor Netty,
|
||||
Undertow, Tomcat, Jetty, and any Servlet 3.1+ container.
|
||||
** <<webflux-web-handler-api>>: Slightly higher level, general-purpose web API for
|
||||
@@ -310,9 +310,9 @@ controllers and functional endpoints are built.
|
||||
requests with non-blocking I/O and Reactive Streams back pressure, along with adapters for
|
||||
https://github.com/reactor/reactor-netty[Reactor Netty] and for the reactive
|
||||
https://github.com/jetty-project/jetty-reactive-httpclient[Jetty HttpClient].
|
||||
The higher level <<web-reactive.adoc#webflux-client,WebClient>> used in applications
|
||||
The higher level <<web-reactive.adoc#webflux-client, WebClient>> used in applications
|
||||
builds on this basic contract.
|
||||
* For client and server, <<webflux-codecs,codecs>> to use to serialize and
|
||||
* For client and server, <<webflux-codecs, codecs>> to use to serialize and
|
||||
deserialize HTTP request and response content.
|
||||
|
||||
|
||||
@@ -453,7 +453,7 @@ to provide a general-purpose web API for processing requests through a chain of
|
||||
{api-spring-framework}/web/server/WebHandler.html[`WebHandler`] component. The chain can
|
||||
be put together with `WebHttpHandlerBuilder` by simply pointing to a Spring
|
||||
`ApplicationContext` where components are
|
||||
<<webflux-web-handler-api-special-beans,auto-detected>>, and/or by registering components
|
||||
<<webflux-web-handler-api-special-beans, auto-detected>>, and/or by registering components
|
||||
with the builder.
|
||||
|
||||
While `HttpHandler` has a simple goal to abstract the use of different HTTP servers, the
|
||||
@@ -536,12 +536,12 @@ Mono<MultiValueMap<String, String>> getFormData();
|
||||
The `DefaultServerWebExchange` uses the configured `HttpMessageReader` to parse form data
|
||||
(`application/x-www-form-urlencoded`) into a `MultiValueMap`. By default,
|
||||
`FormHttpMessageReader` is configured for use by the `ServerCodecConfigurer` bean
|
||||
(see the <<webflux-web-handler-api,Web Handler API>>).
|
||||
(see the <<webflux-web-handler-api, Web Handler API>>).
|
||||
|
||||
|
||||
[[webflux-multipart]]
|
||||
==== Multipart Data
|
||||
[.small]#<<web.adoc#mvc-multipart,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-multipart, Same as in Spring MVC>>#
|
||||
|
||||
`ServerWebExchange` exposes the following method for access to multipart data:
|
||||
|
||||
@@ -559,7 +559,7 @@ into a `MultiValueMap`. At present,
|
||||
https://github.com/synchronoss/nio-multipart[Synchronoss NIO Multipart] is the only
|
||||
third-party library supported and the only library we know for non-blocking parsing of
|
||||
multipart requests. It is enabled through the `ServerCodecConfigurer` bean
|
||||
(see the <<webflux-web-handler-api,Web Handler API>>).
|
||||
(see the <<webflux-web-handler-api, Web Handler API>>).
|
||||
|
||||
To parse multipart data in streaming fashion, you can use the `Flux<Part>` returned from an
|
||||
`HttpMessageReader<Part>` instead. For example, in an annotated controller, use of
|
||||
@@ -570,7 +570,7 @@ content to `Flux<Part>` without collecting to a `MultiValueMap`.
|
||||
|
||||
[[webflux-forwarded-headers]]
|
||||
==== Forwarded Headers
|
||||
[.small]#<<web.adoc#filters-forwarded-headers,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#filters-forwarded-headers, Same as in Spring MVC>>#
|
||||
|
||||
As a request goes through proxies (such as load balancers), the host, port, and
|
||||
scheme may change, and that makes it a challenge, from a client perspective, to create links that point to the correct
|
||||
@@ -601,7 +601,7 @@ filters, and `ForwardedHeaderTransformer` is used instead.
|
||||
|
||||
[[webflux-filters]]
|
||||
=== Filters
|
||||
[.small]#<<web.adoc#filters,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#filters, Same as in Spring MVC>>#
|
||||
|
||||
In the <<webflux-web-handler-api>>, you can use a `WebFilter` to apply interception-style
|
||||
logic before and after the rest of the processing chain of filters and the target
|
||||
@@ -612,7 +612,7 @@ the bean declaration or by implementing `Ordered`.
|
||||
|
||||
[[webflux-filters-cors]]
|
||||
==== CORS
|
||||
[.small]#<<web.adoc#filters-cors,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#filters-cors, Same as in Spring MVC>>#
|
||||
|
||||
Spring WebFlux provides fine-grained support for CORS configuration through annotations on
|
||||
controllers. However, when you use it with Spring Security, we advise relying on the built-in
|
||||
@@ -624,7 +624,7 @@ See the section on <<webflux-cors>> and the <<webflux-cors-webfilter>> for more
|
||||
|
||||
[[webflux-exception-handler]]
|
||||
=== Exceptions
|
||||
[.small]#<<web.adoc#mvc-ann-customer-servlet-container-error-page,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-customer-servlet-container-error-page, Same as in Spring MVC>>#
|
||||
|
||||
In the <<webflux-web-handler-api>>, you can use a `WebExceptionHandler` to handle
|
||||
exceptions from the chain of `WebFilter` instances and the target `WebHandler`. When using the
|
||||
@@ -655,7 +655,7 @@ The following table describes the available `WebExceptionHandler` implementation
|
||||
|
||||
[[webflux-codecs]]
|
||||
=== Codecs
|
||||
[.small]#<<integration.adoc#rest-message-conversion,Same as in Spring MVC>>#
|
||||
[.small]#<<integration.adoc#rest-message-conversion, Same as in Spring MVC>>#
|
||||
|
||||
The `spring-web` and `spring-core` modules provide support for serializing and
|
||||
deserializing byte content to and from higher level objects through non-blocking I/O with
|
||||
@@ -763,7 +763,7 @@ for repeated, map-like access to parts, or otherwise rely on the
|
||||
|
||||
[[webflux-codecs-streaming]]
|
||||
==== Streaming
|
||||
[.small]#<<web.adoc#mvc-ann-async-http-streaming,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-async-http-streaming, Same as in Spring MVC>>#
|
||||
|
||||
When streaming to the HTTP response (for example, `text/event-stream`,
|
||||
`application/stream+json`), it is important to send data periodically, in order to
|
||||
@@ -777,15 +777,15 @@ a heartbeat.
|
||||
|
||||
`DataBuffer` is the representation for a byte buffer in WebFlux. The Spring Core part of
|
||||
the reference has more on that in the section on
|
||||
<<core#databuffers,Data Buffers and Codecs>>. The key point to understand is that on some
|
||||
<<core#databuffers, Data Buffers and Codecs>>. The key point to understand is that on some
|
||||
servers like Netty, byte buffers are pooled and reference counted, and must be released
|
||||
when consumed to avoid memory leaks.
|
||||
|
||||
WebFlux applications generally do not need to be concerned with such issues, unless they
|
||||
consume or produce data buffers directly, as opposed to relying on codecs to convert to
|
||||
and from higher level objects. Or unless they choose to create custom codecs. For such
|
||||
cases please review the the information in <<core#databuffers,Data Buffers and Codecs>>,
|
||||
especially the section on <<core#databuffers-using,Using DataBuffer>>.
|
||||
cases please review the the information in <<core#databuffers, Data Buffers and Codecs>>,
|
||||
especially the section on <<core#databuffers-using, Using DataBuffer>>.
|
||||
|
||||
|
||||
|
||||
@@ -793,7 +793,7 @@ especially the section on <<core#databuffers-using,Using DataBuffer>>.
|
||||
|
||||
[[webflux-logging]]
|
||||
=== Logging
|
||||
[.small]#<<web.adoc#mvc-logging,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-logging, Same as in Spring MVC>>#
|
||||
|
||||
DEBUG level logging in Spring WebFlux is designed to be compact, minimal, and
|
||||
human-friendly. It focuses on high value bits of information that are useful over and
|
||||
@@ -825,7 +825,7 @@ while a fully formatted prefix based on that ID is available from
|
||||
|
||||
[[webflux-logging-sensitive-data]]
|
||||
==== Sensitive Data
|
||||
[.small]#<<web.adoc#mvc-logging-sensitive-data,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-logging-sensitive-data, Same as in Spring MVC>>#
|
||||
|
||||
`DEBUG` and `TRACE` logging can log sensitive information. This is why form parameters and
|
||||
headers are masked by default and you must explicitly enable their logging in full.
|
||||
@@ -868,11 +868,11 @@ WebClient webClient = WebClient.builder()
|
||||
|
||||
[[webflux-dispatcher-handler]]
|
||||
== `DispatcherHandler`
|
||||
[.small]#<<web.adoc#mvc-servlet,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-servlet, Same as in Spring MVC>>#
|
||||
|
||||
Spring WebFlux, similarly to Spring MVC, is designed around the front controller pattern, where a
|
||||
central `WebHandler`, the `DispatcherHandler`, provides a shared algorithm for request
|
||||
processing, while actual work is performed by configurable, delegate components.
|
||||
Spring WebFlux, similarly to Spring MVC, is designed around the front controller pattern,
|
||||
where a central `WebHandler`, the `DispatcherHandler`, provides a shared algorithm for
|
||||
request processing, while actual work is performed by configurable, delegate components.
|
||||
This model is flexible and supports diverse workflows.
|
||||
|
||||
`DispatcherHandler` discovers the delegate components it needs from Spring configuration.
|
||||
@@ -880,8 +880,7 @@ It is also designed to be a Spring bean itself and implements `ApplicationContex
|
||||
for access to the context in which it runs. If `DispatcherHandler` is declared with a bean
|
||||
name of `webHandler`, it is, in turn, discovered by
|
||||
{api-spring-framework}/web/server/adapter/WebHttpHandlerBuilder.html[`WebHttpHandlerBuilder`],
|
||||
which puts together a request-processing chain, as described in
|
||||
<<webflux-web-handler-api>>.
|
||||
which puts together a request-processing chain, as described in <<webflux-web-handler-api>>.
|
||||
|
||||
Spring configuration in a WebFlux application typically contains:
|
||||
|
||||
@@ -902,14 +901,13 @@ HttpHandler handler = WebHttpHandlerBuilder.applicationContext(context);
|
||||
----
|
||||
====
|
||||
|
||||
The resulting `HttpHandler` is ready for use with a
|
||||
<<webflux-httphandler,server adapter>>.
|
||||
The resulting `HttpHandler` is ready for use with a <<webflux-httphandler, server adapter>>.
|
||||
|
||||
|
||||
|
||||
[[webflux-special-bean-types]]
|
||||
=== Special Bean Types
|
||||
[.small]#<<web.adoc#mvc-servlet-special-bean-types,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-servlet-special-bean-types, Same as in Spring MVC>>#
|
||||
|
||||
The `DispatcherHandler` delegates to special beans to process requests and render the
|
||||
appropriate responses. By "`special beans,`" we mean Spring-managed `Object` instances that
|
||||
@@ -951,11 +949,11 @@ there are also some other beans detected at a lower level (see
|
||||
|
||||
[[webflux-framework-config]]
|
||||
=== WebFlux Config
|
||||
[.small]#<<web.adoc#mvc-servlet-config,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-servlet-config, Same as in Spring MVC>>#
|
||||
|
||||
Applications can declare the infrastructure beans (listed under
|
||||
<<webflux-web-handler-api-special-beans,Web Handler API>> and
|
||||
<<webflux-special-bean-types,`DispatcherHandler`>>) that are required to process requests.
|
||||
<<webflux-web-handler-api-special-beans, Web Handler API>> and
|
||||
<<webflux-special-bean-types, `DispatcherHandler`>>) that are required to process requests.
|
||||
However, in most cases, the <<webflux-config>> is the best starting point. It declares the
|
||||
required beans and provides a higher-level configuration callback API to customize it.
|
||||
|
||||
@@ -966,7 +964,7 @@ many extra convenient options.
|
||||
|
||||
[[webflux-dispatcher-handler-sequence]]
|
||||
=== Processing
|
||||
[.small]#<<web.adoc#mvc-servlet-sequence,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-servlet-sequence, Same as in Spring MVC>>#
|
||||
|
||||
`DispatcherHandler` processes requests as follows:
|
||||
|
||||
@@ -1017,7 +1015,7 @@ as a `HandlerResult`, along with some additional context, and passed to the firs
|
||||
|
||||
[[webflux-dispatcher-exceptions]]
|
||||
=== Exceptions
|
||||
[.small]#<<web.adoc#mvc-exceptionhandlers,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-exceptionhandlers, Same as in Spring MVC>>#
|
||||
|
||||
The `HandlerResult` returned from a `HandlerAdapter` can expose a function for error
|
||||
handling based on some handler-specific mechanism. This error function is called if:
|
||||
@@ -1040,18 +1038,18 @@ See also <<webflux-ann-controller-exceptions>> in the "`Annotated Controller`" s
|
||||
|
||||
[[webflux-viewresolution]]
|
||||
=== View Resolution
|
||||
[.small]#<<web.adoc#mvc-viewresolver,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-viewresolver, Same as in Spring MVC>>#
|
||||
|
||||
View resolution enables rendering to a browser with an HTML template and a model without
|
||||
tying you to a specific view technology. In Spring WebFlux, view resolution is
|
||||
supported through a dedicated <<webflux-resulthandling,HandlerResultHandler>> that uses
|
||||
supported through a dedicated <<webflux-resulthandling, HandlerResultHandler>> that uses
|
||||
`ViewResolver` instances to map a String (representing a logical view name) to a `View`
|
||||
instance. The `View` is then used to render the response.
|
||||
|
||||
|
||||
[[webflux-viewresolution-handling]]
|
||||
==== Handling
|
||||
[.small]#<<web.adoc#mvc-handling,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-handling, Same as in Spring MVC>>#
|
||||
|
||||
The `HandlerResult` passed into `ViewResolutionResultHandler` contains the return value
|
||||
from the handler and the model that contains attributes added during request
|
||||
@@ -1079,7 +1077,7 @@ value or no value (if empty), while multi-value reactive types (for example, `Fl
|
||||
collected and resolved to `List<T>`.
|
||||
|
||||
To configure view resolution is as simple as adding a `ViewResolutionResultHandler` bean
|
||||
to your Spring configuration. <<webflux-config-view-resolvers,WebFlux Config>> provides a
|
||||
to your Spring configuration. <<webflux-config-view-resolvers, WebFlux Config>> provides a
|
||||
dedicated configuration API for view resolution.
|
||||
|
||||
See <<webflux-view>> for more on the view technologies integrated with Spring WebFlux.
|
||||
@@ -1087,7 +1085,7 @@ See <<webflux-view>> for more on the view technologies integrated with Spring We
|
||||
|
||||
[[webflux-redirecting-redirect-prefix]]
|
||||
==== Redirecting
|
||||
[.small]#<<web.adoc#mvc-redirecting-redirect-prefix,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-redirecting-redirect-prefix, Same as in Spring MVC>>#
|
||||
|
||||
The special `redirect:` prefix in a view name lets you perform a redirect. The
|
||||
`UrlBasedViewResolver` (and sub-classes) recognize this as an instruction that a
|
||||
@@ -1102,7 +1100,7 @@ operate in terms of logical view names. A view name such as
|
||||
|
||||
[[webflux-multiple-representations]]
|
||||
==== Content Negotiation
|
||||
[.small]#<<web.adoc#mvc-multiple-representations,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-multiple-representations, Same as in Spring MVC>>#
|
||||
|
||||
`ViewResolutionResultHandler` supports content negotiation. It compares the request
|
||||
media types with the media types supported by each selected `View`. The first `View`
|
||||
@@ -1110,8 +1108,8 @@ that supports the requested media type(s) is used.
|
||||
|
||||
In order to support media types such as JSON and XML, Spring WebFlux provides
|
||||
`HttpMessageWriterView`, which is a special `View` that renders through an
|
||||
<<webflux-codecs,HttpMessageWriter>>. Typically, you would configure these as default
|
||||
views through the <<webflux-config-view-resolvers,WebFlux Configuration>>. Default views are
|
||||
<<webflux-codecs, HttpMessageWriter>>. Typically, you would configure these as default
|
||||
views through the <<webflux-config-view-resolvers, WebFlux Configuration>>. Default views are
|
||||
always selected and used if they match the requested media type.
|
||||
|
||||
|
||||
@@ -1119,7 +1117,7 @@ always selected and used if they match the requested media type.
|
||||
|
||||
[[webflux-controller]]
|
||||
== Annotated Controllers
|
||||
[.small]#<<web.adoc#mvc-controller,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-controller, Same as in Spring MVC>>#
|
||||
|
||||
Spring WebFlux provides an annotation-based programming model, where `@Controller` and
|
||||
`@RestController` components use annotations to express request mappings, request input,
|
||||
@@ -1149,7 +1147,7 @@ In the preceding example, the method returns a `String` to be written to the res
|
||||
|
||||
[[webflux-ann-controller]]
|
||||
=== `@Controller`
|
||||
[.small]#<<web.adoc#mvc-ann-controller,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-controller, Same as in Spring MVC>>#
|
||||
|
||||
You can define controller beans by using a standard Spring bean definition.
|
||||
The `@Controller` stereotype allows for auto-detection and is aligned with Spring general support
|
||||
@@ -1174,7 +1172,7 @@ your Java configuration, as the following example shows:
|
||||
<1> Scan the `org.example.web` package.
|
||||
====
|
||||
|
||||
`@RestController` is a <<core.adoc#beans-meta-annotations,composed annotation>> that is
|
||||
`@RestController` is a <<core.adoc#beans-meta-annotations, composed annotation>> that is
|
||||
itself meta-annotated with `@Controller` and `@ResponseBody`, indicating a controller whose
|
||||
every method inherits the type-level `@ResponseBody` annotation and, therefore, writes
|
||||
directly to the response body versus view resolution and rendering with an HTML template.
|
||||
@@ -1183,7 +1181,7 @@ directly to the response body versus view resolution and rendering with an HTML
|
||||
|
||||
[[webflux-ann-requestmapping]]
|
||||
=== Request Mapping
|
||||
[.small]#<<web.adoc#mvc-ann-requestmapping,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-requestmapping, Same as in Spring MVC>>#
|
||||
|
||||
The `@RequestMapping` annotation is used to map requests to controllers methods. It has
|
||||
various attributes to match by URL, HTTP method, request parameters, headers, and media
|
||||
@@ -1230,7 +1228,7 @@ The following example uses type and method level mappings:
|
||||
|
||||
[[webflux-ann-requestmapping-uri-templates]]
|
||||
==== URI Patterns
|
||||
[.small]#<<web.adoc#mvc-ann-requestmapping-uri-templates,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-requestmapping-uri-templates, Same as in Spring MVC>>#
|
||||
|
||||
You can map requests by using glob patterns and wildcards:
|
||||
|
||||
@@ -1317,7 +1315,7 @@ explicit, and less vulnerable to URL path based exploits.
|
||||
|
||||
[[webflux-ann-requestmapping-pattern-comparison]]
|
||||
==== Pattern Comparison
|
||||
[.small]#<<web.adoc#mvc-ann-requestmapping-pattern-comparison,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-requestmapping-pattern-comparison, Same as in Spring MVC>>#
|
||||
|
||||
When multiple patterns match a URL, they must be compared to find the best match. This is done
|
||||
with `PathPattern.SPECIFICITY_COMPARATOR`, which looks for patterns that are more specific.
|
||||
@@ -1332,7 +1330,7 @@ sorted last instead. If two patterns are both catch-all, the longer is chosen.
|
||||
|
||||
[[webflux-ann-requestmapping-consumes]]
|
||||
==== Consumable Media Types
|
||||
[.small]#<<web.adoc#mvc-ann-requestmapping-consumes,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-requestmapping-consumes, Same as in Spring MVC>>#
|
||||
|
||||
You can narrow the request mapping based on the `Content-Type` of the request,
|
||||
as the following example shows:
|
||||
@@ -1361,7 +1359,7 @@ TIP: `MediaType` provides constants for commonly used media types -- for example
|
||||
|
||||
[[webflux-ann-requestmapping-produces]]
|
||||
==== Producible Media Types
|
||||
[.small]#<<web.adoc#mvc-ann-requestmapping-produces,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-requestmapping-produces, Same as in Spring MVC>>#
|
||||
|
||||
You can narrow the request mapping based on the `Accept` request header and the list of
|
||||
content types that a controller method produces, as the following example shows:
|
||||
@@ -1396,7 +1394,7 @@ TIP: `MediaType` provides constants for commonly used media types -- e.g.
|
||||
|
||||
[[webflux-ann-requestmapping-params-and-headers]]
|
||||
==== Parameters and Headers
|
||||
[.small]#<<web.adoc#mvc-ann-requestmapping-params-and-headers,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-requestmapping-params-and-headers, Same as in Spring MVC>>#
|
||||
|
||||
You can narrow request mappings based on query parameter conditions. You can test for the
|
||||
presence of a query parameter (`myParam`), for its absence (`!myParam`), or for a
|
||||
@@ -1431,7 +1429,7 @@ You can also use the same with request header conditions, as the follwing exampl
|
||||
|
||||
[[webflux-ann-requestmapping-head-options]]
|
||||
==== HTTP HEAD, OPTIONS
|
||||
[.small]#<<web.adoc#mvc-ann-requestmapping-head-options,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-requestmapping-head-options, Same as in Spring MVC>>#
|
||||
|
||||
`@GetMapping` and `@RequestMapping(method=HttpMethod.GET)` support HTTP HEAD
|
||||
transparently for request mapping purposes. Controller methods need not change.
|
||||
@@ -1452,9 +1450,9 @@ is not necessary in the common case.
|
||||
|
||||
[[webflux-ann-requestmapping-composed]]
|
||||
==== Custom Annotations
|
||||
[.small]#<<web.adoc#mvc-ann-requestmapping-composed,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-requestmapping-composed, Same as in Spring MVC>>#
|
||||
|
||||
Spring WebFlux supports the use of <<core.adoc#beans-meta-annotations,composed annotations>>
|
||||
Spring WebFlux supports the use of <<core.adoc#beans-meta-annotations, composed annotations>>
|
||||
for request mapping. Those are annotations that are themselves meta-annotated with
|
||||
`@RequestMapping` and composed to redeclare a subset (or all) of the `@RequestMapping`
|
||||
attributes with a narrower, more specific purpose.
|
||||
@@ -1473,7 +1471,7 @@ you can check the custom attribute and return your own `RequestCondition`.
|
||||
|
||||
[[webflux-ann-requestmapping-registration]]
|
||||
==== Explicit Registrations
|
||||
[.small]#<<web.adoc#mvc-ann-requestmapping-registration,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-requestmapping-registration, Same as in Spring MVC>>#
|
||||
|
||||
You can programmatically register Handler methods, which can be used for dynamic
|
||||
registrations or for advanced cases, such as different instances of the same handler
|
||||
@@ -1510,7 +1508,7 @@ public class MyConfig {
|
||||
|
||||
[[webflux-ann-methods]]
|
||||
=== Handler Methods
|
||||
[.small]#<<web.adoc#mvc-ann-methods,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-methods, Same as in Spring MVC>>#
|
||||
|
||||
`@RequestMapping` handler methods have a flexible signature and can choose from a range of
|
||||
supported controller method arguments and return values.
|
||||
@@ -1518,11 +1516,11 @@ supported controller method arguments and return values.
|
||||
|
||||
[[webflux-ann-arguments]]
|
||||
==== Method Arguments
|
||||
[.small]#<<web.adoc#mvc-ann-arguments,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-arguments, Same as in Spring MVC>>#
|
||||
|
||||
The following table shows the supported controller method arguments.
|
||||
|
||||
Reactive types (Reactor, RxJava, <<webflux-reactive-libraries,or other>>) are
|
||||
Reactive types (Reactor, RxJava, <<webflux-reactive-libraries, or other>>) are
|
||||
supported on arguments that require blocking I/O (for example, reading the request body) to
|
||||
be resolved. This is marked in the Description column. Reactive types are not expected
|
||||
on arguments that do not require blocking.
|
||||
@@ -1639,10 +1637,10 @@ and others) and is equivalent to `required=false`.
|
||||
|
||||
[[webflux-ann-return-types]]
|
||||
==== Return Values
|
||||
[.small]#<<web.adoc#mvc-ann-return-types,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-return-types, Same as in Spring MVC>>#
|
||||
|
||||
The following table shows the supported controller method return values. Note that reactive types
|
||||
from libraries such as Reactor, RxJava, <<webflux-reactive-libraries,or other>> are
|
||||
The following table shows the supported controller method return values. Note that reactive
|
||||
types from libraries such as Reactor, RxJava, <<webflux-reactive-libraries, or other>> are
|
||||
generally supported for all return values.
|
||||
|
||||
[cols="1,2", options="header"]
|
||||
@@ -1665,12 +1663,13 @@ generally supported for all return values.
|
||||
| A view name to be resolved with `ViewResolver` instances and used together with the implicit
|
||||
model -- determined through command objects and `@ModelAttribute` methods. The handler
|
||||
method can also programmatically enrich the model by declaring a `Model` argument
|
||||
(described <<webflux-viewresolution-handling,earlier>>).
|
||||
(described <<webflux-viewresolution-handling, earlier>>).
|
||||
|
||||
| `View`
|
||||
| A `View` instance to use for rendering together with the implicit model -- determined
|
||||
through command objects and `@ModelAttribute` methods. The handler method can also
|
||||
programmatically enrich the model by declaring a `Model` argument (described <<webflux-viewresolution-handling,earlier>>).
|
||||
programmatically enrich the model by declaring a `Model` argument
|
||||
(described <<webflux-viewresolution-handling, earlier>>).
|
||||
|
||||
| `java.util.Map`, `org.springframework.ui.Model`
|
||||
| Attributes to be added to the implicit model, with the view name implicitly determined
|
||||
@@ -1712,7 +1711,7 @@ generally supported for all return values.
|
||||
|
||||
[[webflux-ann-typeconversion]]
|
||||
==== Type Conversion
|
||||
[.small]#<<web.adoc#mvc-ann-typeconversion,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-typeconversion, Same as in Spring MVC>>#
|
||||
|
||||
Some annotated controller method arguments that represent String-based request input (for example,
|
||||
`@RequestParam`, `@RequestHeader`, `@PathVariable`, `@MatrixVariable`, and `@CookieValue`)
|
||||
@@ -1721,13 +1720,12 @@ can require type conversion if the argument is declared as something other than
|
||||
For such cases, type conversion is automatically applied based on the configured converters.
|
||||
By default, simple types (such as `int`, `long`, `Date`, and others) are supported. Type conversion
|
||||
can be customized through a `WebDataBinder` (see <<mvc-ann-initbinder>>) or by registering
|
||||
`Formatters` with the `FormattingConversionService` (see
|
||||
<<core.adoc#format, Spring Field Formatting>>).
|
||||
`Formatters` with the `FormattingConversionService` (see <<core.adoc#format, Spring Field Formatting>>).
|
||||
|
||||
|
||||
[[webflux-ann-matrix-variables]]
|
||||
==== Matrix Variables
|
||||
[.small]#<<web.adoc#mvc-ann-matrix-variables,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-matrix-variables, Same as in Spring MVC>>#
|
||||
|
||||
http://tools.ietf.org/html/rfc3986#section-3.3[RFC 3986] discusses name-value pairs in
|
||||
path segments. In Spring WebFlux, we refer to those as "`matrix variables`" based on an
|
||||
@@ -1820,7 +1818,7 @@ To get all matrix variables, use a `MultiValueMap`, as the following example sho
|
||||
|
||||
[[webflux-ann-requestparam]]
|
||||
==== `@RequestParam`
|
||||
[.small]#<<web.adoc#mvc-ann-requestparam,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-requestparam, Same as in Spring MVC>>#
|
||||
|
||||
You can use the `@RequestParam` annotation to bind query parameters to a method argument in a
|
||||
controller. The following code snippet shows the usage:
|
||||
@@ -1853,7 +1851,7 @@ TIP: The Servlet API "`request parameter`" concept conflates query parameters, f
|
||||
data, and multiparts into one. However, in WebFlux, each is accessed individually through
|
||||
`ServerWebExchange`. While `@RequestParam` binds to query parameters only, you can use
|
||||
data binding to apply query parameters, form data, and multiparts to a
|
||||
<<webflux-ann-modelattrib-method-args,command object>>.
|
||||
<<webflux-ann-modelattrib-method-args, command object>>.
|
||||
|
||||
Method parameters that use the `@RequestParam` annotation are required by default, but
|
||||
you can specify that a method parameter is optional by setting the required flag of a `@RequestParam`
|
||||
@@ -1875,7 +1873,7 @@ with `@RequestParam`.
|
||||
|
||||
[[webflux-ann-requestheader]]
|
||||
==== `@RequestHeader`
|
||||
[.small]#<<web.adoc#mvc-ann-requestheader,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-requestheader, Same as in Spring MVC>>#
|
||||
|
||||
You can use the `@RequestHeader` annotation to bind a request header to a method argument in a
|
||||
controller.
|
||||
@@ -1927,7 +1925,7 @@ example, a method parameter annotated with `@RequestHeader("Accept")` may be of
|
||||
|
||||
[[webflux-ann-cookievalue]]
|
||||
==== `@CookieValue`
|
||||
[.small]#<<web.adoc#mvc-ann-cookievalue,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-cookievalue, Same as in Spring MVC>>#
|
||||
|
||||
You can use the `@CookieValue` annotation to bind the value of an HTTP cookie to a method argument
|
||||
in a controller.
|
||||
@@ -1962,7 +1960,7 @@ Type conversion is applied automatically if the target method parameter type is
|
||||
|
||||
[[webflux-ann-modelattrib-method-args]]
|
||||
==== `@ModelAttribute`
|
||||
[.small]#<<web.adoc#mvc-ann-modelattrib-method-args,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-modelattrib-method-args, Same as in Spring MVC>>#
|
||||
|
||||
You can use the `@ModelAttribute` annotation on a method argument to access an attribute from the
|
||||
model or have it instantiated if not present. The model attribute is also overlain with
|
||||
@@ -2017,7 +2015,7 @@ immediately next to the `@ModelAttribute`, as the following example shows:
|
||||
|
||||
You can automatically apply validation after data binding by adding the
|
||||
`javax.validation.Valid` annotation or Spring's `@Validated` annotation (see also
|
||||
<<core.adoc#validation-beanvalidation, Bean validation>> and
|
||||
<<core.adoc#validation-beanvalidation, Bean Validation>> and
|
||||
<<core.adoc#validation, Spring validation>>). The following example uses the `@Valid` annotation:
|
||||
|
||||
====
|
||||
@@ -2069,7 +2067,7 @@ with `@ModelAttribute`.
|
||||
|
||||
[[webflux-ann-sessionattributes]]
|
||||
==== `@SessionAttributes`
|
||||
[.small]#<<web.adoc#mvc-ann-sessionattributes,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-sessionattributes, Same as in Spring MVC>>#
|
||||
|
||||
`@SessionAttributes` is used to store model attributes in the `WebSession` between
|
||||
requests. It is a type-level annotation that declares session attributes used by a
|
||||
@@ -2125,7 +2123,7 @@ as the following example shows:
|
||||
|
||||
[[webflux-ann-sessionattribute]]
|
||||
==== `@SessionAttribute`
|
||||
[.small]#<<web.adoc#mvc-ann-sessionattribute,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-sessionattribute, Same as in Spring MVC>>#
|
||||
|
||||
If you need access to pre-existing session attributes that are managed globally
|
||||
(that is, outside the controller -- for example, by a filter) and may or may not be present,
|
||||
@@ -2153,7 +2151,7 @@ workflow, consider using `SessionAttributes`, as described in
|
||||
|
||||
[[webflux-ann-requestattrib]]
|
||||
==== `@RequestAttribute`
|
||||
[.small]#<<web.adoc#mvc-ann-requestattrib,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-requestattrib, Same as in Spring MVC>>#
|
||||
|
||||
Similarly to `@SessionAttribute`, you can use the `@RequestAttribute` annotation to
|
||||
access pre-existing request attributes created earlier (for example, by a `WebFilter`),
|
||||
@@ -2174,11 +2172,11 @@ as the following example shows:
|
||||
|
||||
[[webflux-multipart-forms]]
|
||||
==== Multipart Content
|
||||
[.small]#<<web.adoc#mvc-multipart-forms,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-multipart-forms, Same as in Spring MVC>>#
|
||||
|
||||
As explained in <<webflux-multipart>>, `ServerWebExchange` provides access to multipart
|
||||
content. The best way to handle a file upload form (for example, from a browser) in a controller
|
||||
is through data binding to a <<webflux-ann-modelattrib-method-args,command object>>,
|
||||
is through data binding to a <<webflux-ann-modelattrib-method-args, command object>>,
|
||||
as the following example shows:
|
||||
|
||||
====
|
||||
@@ -2317,7 +2315,7 @@ To access multipart data sequentially, in streaming fashion, you can use `@Reque
|
||||
|
||||
[[webflux-ann-requestbody]]
|
||||
==== `@RequestBody`
|
||||
[.small]#<<web.adoc#mvc-ann-requestbody,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-requestbody, Same as in Spring MVC>>#
|
||||
|
||||
You can use the `@RequestBody` annotation to have the request body read and deserialized into an
|
||||
`Object` through an <<webflux-codecs,HttpMessageReader>>.
|
||||
@@ -2373,7 +2371,7 @@ example uses a `BindingResult` argument`:
|
||||
|
||||
[[webflux-ann-httpentity]]
|
||||
==== `HttpEntity`
|
||||
[.small]#<<web.adoc#mvc-ann-httpentity,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-httpentity, Same as in Spring MVC>>#
|
||||
|
||||
`HttpEntity` is more or less identical to using <<webflux-ann-requestbody>> but is based on a
|
||||
container object that exposes request headers and the body. The following example uses an
|
||||
@@ -2393,10 +2391,11 @@ container object that exposes request headers and the body. The following exampl
|
||||
|
||||
[[webflux-ann-responsebody]]
|
||||
==== `@ResponseBody`
|
||||
[.small]#<<web.adoc#mvc-ann-responsebody,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-responsebody, Same as in Spring MVC>>#
|
||||
|
||||
You can use the `@ResponseBody` annotation on a method to have the return serialized to the
|
||||
response body through an <<webflux-codecs,HttpMessageWriter>>. The following example shows how to do so:
|
||||
You can use the `@ResponseBody` annotation on a method to have the return serialized
|
||||
to the response body through an <<webflux-codecs, HttpMessageWriter>>. The following
|
||||
example shows how to do so:
|
||||
|
||||
====
|
||||
[source,java,indent=0]
|
||||
@@ -2428,7 +2427,7 @@ configure or customize message writing.
|
||||
|
||||
[[webflux-ann-responseentity]]
|
||||
==== `ResponseEntity`
|
||||
[.small]#<<web.adoc#mvc-ann-responseentity,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-responseentity, Same as in Spring MVC>>#
|
||||
|
||||
`ResponseEntity` is like <<webflux-ann-responsebody>> but with status and headers. For example:
|
||||
|
||||
@@ -2445,7 +2444,7 @@ configure or customize message writing.
|
||||
----
|
||||
====
|
||||
|
||||
WebFlux supports using a single value <<webflux-reactive-libraries,reactive type>> to
|
||||
WebFlux supports using a single value <<webflux-reactive-libraries, reactive type>> to
|
||||
produce the `ResponseEntity` asynchronously, and/or single and multi-value reactive types
|
||||
for the body.
|
||||
|
||||
@@ -2457,7 +2456,7 @@ Spring offers support for the Jackson JSON library.
|
||||
|
||||
[[webflux-ann-jsonview]]
|
||||
===== JSON Views
|
||||
[.small]#<<web.adoc#mvc-ann-jackson,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-jackson, Same as in Spring MVC>>#
|
||||
|
||||
Spring WebFlux provides built-in support for
|
||||
http://wiki.fasterxml.com/JacksonJsonViews[Jackson's Serialization Views],
|
||||
@@ -2515,11 +2514,11 @@ controller method. Use a composite interface if you need to activate multiple vi
|
||||
|
||||
[[webflux-ann-modelattrib-methods]]
|
||||
=== `Model`
|
||||
[.small]#<<web.adoc#mvc-ann-modelattrib-methods,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-modelattrib-methods, Same as in Spring MVC>>#
|
||||
|
||||
You can use the `@ModelAttribute` annotation:
|
||||
|
||||
* On a <<webflux-ann-modelattrib-method-args,method argument>> in `@RequestMapping` methods
|
||||
* On a <<webflux-ann-modelattrib-method-args, method argument>> in `@RequestMapping` methods
|
||||
to create or access an Object from the model and to bind it to the request through a
|
||||
`WebDataBinder`.
|
||||
* As a method-level annotation in `@Controller` or `@ControllerAdvice` classes, helping
|
||||
@@ -2618,7 +2617,7 @@ as the following example shows:
|
||||
|
||||
[[webflux-ann-initbinder]]
|
||||
=== `DataBinder`
|
||||
[.small]#<<web.adoc#mvc-ann-initbinder,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-initbinder, Same as in Spring MVC>>#
|
||||
|
||||
`@Controller` or `@ControllerAdvice` classes can have `@InitBinder` methods, to
|
||||
initialize instances of `WebDataBinder`. Those, in turn, are used to:
|
||||
@@ -2630,7 +2629,7 @@ headers, cookies, and others) to the target type of controller method arguments.
|
||||
|
||||
`@InitBinder` methods can register controller-specific `java.bean.PropertyEditor` or
|
||||
Spring `Converter` and `Formatter` components. In addition, you can use the
|
||||
<<webflux-config-conversion,WebFlux Java configuration>> to register `Converter` and
|
||||
<<webflux-config-conversion, WebFlux Java configuration>> to register `Converter` and
|
||||
`Formatter` types in a globally shared `FormattingConversionService`.
|
||||
|
||||
`@InitBinder` methods support many of the same arguments that `@RequestMapping` methods
|
||||
@@ -2684,9 +2683,9 @@ controller-specific `Formatter` instances, as the following example shows:
|
||||
|
||||
[[webflux-ann-controller-exceptions]]
|
||||
=== Managing Exceptions
|
||||
[.small]#<<web.adoc#mvc-ann-exceptionhandler,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-exceptionhandler, Same as in Spring MVC>>#
|
||||
|
||||
`@Controller` and <<mvc-ann-controller-advice,@ControllerAdvice>> classes can have
|
||||
`@Controller` and <<mvc-ann-controller-advice, @ControllerAdvice>> classes can have
|
||||
`@ExceptionHandler` methods to handle exceptions from controller methods. The following
|
||||
example includes such a handler method:
|
||||
|
||||
@@ -2709,14 +2708,15 @@ example includes such a handler method:
|
||||
====
|
||||
|
||||
The exception can match against a top-level exception being propagated (that is, a direct
|
||||
`IOException` being thrown) or against the immediate cause within a top-level wrapper exception
|
||||
(for example, an `IOException` wrapped inside an `IllegalStateException`).
|
||||
`IOException` being thrown) or against the immediate cause within a top-level wrapper
|
||||
exception (for example, an `IOException` wrapped inside an `IllegalStateException`).
|
||||
|
||||
For matching exception types, preferably declare the target exception as a method argument,
|
||||
as shown in the preceding example. Alternatively, the annotation declaration can narrow the exception types to
|
||||
match. We generally recommend being as specific as possible in the argument signature and to
|
||||
declare your primary root exception mappings on a `@ControllerAdvice` prioritized with a
|
||||
corresponding order. See <<web.adoc#mvc-ann-exceptionhandler,the MVC section>> for details.
|
||||
as shown in the preceding example. Alternatively, the annotation declaration can narrow the
|
||||
exception types to match. We generally recommend being as specific as possible in the
|
||||
argument signature and to declare your primary root exception mappings on a
|
||||
`@ControllerAdvice` prioritized with a corresponding order.
|
||||
See <<web.adoc#mvc-ann-exceptionhandler, the MVC section>> for details.
|
||||
|
||||
NOTE: An `@ExceptionHandler` method in WebFlux supports the same method arguments and
|
||||
return values as a `@RequestMapping` method, with the exception of request body-
|
||||
@@ -2729,7 +2729,7 @@ for more detail.
|
||||
|
||||
[[webflux-ann-rest-exceptions]]
|
||||
==== REST API exceptions
|
||||
[.small]#<<web.adoc#mvc-ann-rest-exceptions,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-rest-exceptions, Same as in Spring MVC>>#
|
||||
|
||||
A common requirement for REST services is to include error details in the body of the
|
||||
response. The Spring Framework does not automatically do so, because the representation
|
||||
@@ -2747,7 +2747,7 @@ an HTTP status code.
|
||||
|
||||
[[webflux-ann-controller-advice]]
|
||||
=== Controller Advice
|
||||
[.small]#<<web.adoc#mvc-ann-controller-advice,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-ann-controller-advice, Same as in Spring MVC>>#
|
||||
|
||||
Typically, the `@ExceptionHandler`, `@InitBinder`, and `@ModelAttribute` methods apply within
|
||||
the `@Controller` class (or class hierarchy) in which they are declared. If you want such
|
||||
@@ -2755,7 +2755,7 @@ methods to apply more globally (across controllers), you can declare them in a c
|
||||
marked with `@ControllerAdvice` or `@RestControllerAdvice`.
|
||||
|
||||
`@ControllerAdvice` is marked with `@Component`, which means that such classes can be registered
|
||||
as Spring beans through <<core.adoc#beans-java-instantiating-container-scan,component scanning>>.
|
||||
as Spring beans through <<core.adoc#beans-java-instantiating-container-scan, component scanning>>.
|
||||
`@RestControllerAdvice` is also a meta-annotation marked with both `@ControllerAdvice` and
|
||||
`@ResponseBody`, which essentially means `@ExceptionHandler` methods are rendered to the
|
||||
response body through message conversion (versus view resolution or template rendering).
|
||||
@@ -2800,7 +2800,7 @@ include::webflux-functional.adoc[leveloffset=+1]
|
||||
|
||||
[[webflux-uri-building]]
|
||||
== URI Links
|
||||
[.small]#<<web.adoc#mvc-uri-building,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-uri-building, Same as in Spring MVC>>#
|
||||
|
||||
This section describes various options available in the Spring Framework to prepare URIs.
|
||||
|
||||
@@ -2813,7 +2813,7 @@ include::webflux-cors.adoc[leveloffset=+1]
|
||||
|
||||
[[webflux-web-security]]
|
||||
== Web Security
|
||||
[.small]#<<web.adoc#mvc-web-security,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-web-security, Same as in Spring MVC>>#
|
||||
|
||||
The http://projects.spring.io/spring-security/[Spring Security] project provides support
|
||||
for protecting web applications from malicious exploits. See the Spring Security
|
||||
@@ -2831,7 +2831,7 @@ include::webflux-view.adoc[leveloffset=+1]
|
||||
|
||||
[[webflux-caching]]
|
||||
== HTTP Caching
|
||||
[.small]#<<web.adoc#mvc-caching,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-caching, Same as in Spring MVC>>#
|
||||
|
||||
HTTP caching can significantly improve the performance of a web application. HTTP caching
|
||||
revolves around the `Cache-Control` response header and subsequent conditional request
|
||||
@@ -2847,7 +2847,7 @@ This section describes the HTTP caching related options available in Spring WebF
|
||||
|
||||
[[webflux-caching-cachecontrol]]
|
||||
=== `CacheControl`
|
||||
[.small]#<<web.adoc#mvc-caching-cachecontrol,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-caching-cachecontrol, Same as in Spring MVC>>#
|
||||
|
||||
{api-spring-framework}/http/CacheControl.html[`CacheControl`] provides support for
|
||||
configuring settings related to the `Cache-Control` header and is accepted as an argument
|
||||
@@ -2881,7 +2881,7 @@ use case-oriented approach that focuses on the common scenarios, as the followin
|
||||
|
||||
[[webflux-caching-etag-lastmodified]]
|
||||
=== Controllers
|
||||
[.small]#<<web.adoc#mvc-caching-etag-lastmodified,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-caching-etag-lastmodified, Same as in Spring MVC>>#
|
||||
|
||||
Controllers can add explicit support for HTTP caching. We recommend doing so, since the
|
||||
`lastModified` or `ETag` value for a resource needs to be calculated before it can be compared
|
||||
@@ -2946,7 +2946,7 @@ to 409 (PRECONDITION_FAILED) to prevent concurrent modification.
|
||||
|
||||
[[webflux-caching-static-resources]]
|
||||
=== Static Resources
|
||||
[.small]#<<web.adoc#mvc-caching-static-resources,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-caching-static-resources, Same as in Spring MVC>>#
|
||||
|
||||
You should serve static resources with a `Cache-Control` and conditional response headers
|
||||
for optimal performance. See the section on configuring <<webflux-config-static-resources>>.
|
||||
@@ -2956,13 +2956,14 @@ for optimal performance. See the section on configuring <<webflux-config-static-
|
||||
|
||||
[[webflux-config]]
|
||||
== WebFlux Config
|
||||
[.small]#<<web.adoc#mvc-config,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-config, Same as in Spring MVC>>#
|
||||
|
||||
The WebFlux Java configuration declares the components that are required to process requests with annotated
|
||||
controllers or functional endpoints, and it offers an API to customize the configuration.
|
||||
That means you do not need to understand the underlying beans created by the Java configuration.
|
||||
However, if you want to understand them, you can see them in `WebFluxConfigurationSupport` or read more
|
||||
about what they are in <<webflux-special-bean-types>>.
|
||||
The WebFlux Java configuration declares the components that are required to process
|
||||
requests with annotated controllers or functional endpoints, and it offers an API to
|
||||
customize the configuration. That means you do not need to understand the underlying
|
||||
beans created by the Java configuration. However, if you want to understand them,
|
||||
you can see them in `WebFluxConfigurationSupport` or read more about what they are
|
||||
in <<webflux-special-bean-types>>.
|
||||
|
||||
For more advanced customizations, not available in the configuration API, you can
|
||||
gain full control over the configuration through the
|
||||
@@ -2972,7 +2973,7 @@ gain full control over the configuration through the
|
||||
|
||||
[[webflux-config-enable]]
|
||||
=== Enabling WebFlux Config
|
||||
[.small]#<<web.adoc#mvc-config-enable,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-config-enable, Same as in Spring MVC>>#
|
||||
|
||||
You can use the `@EnableWebFlux` annotation in your Java config, as the following example shows:
|
||||
|
||||
@@ -2988,14 +2989,14 @@ You can use the `@EnableWebFlux` annotation in your Java config, as the followin
|
||||
====
|
||||
|
||||
The preceding example registers a number of Spring WebFlux
|
||||
<<mvc-webflux-special-bean-types,infrastructure beans>> and adapts to dependencies
|
||||
<<mvc-webflux-special-bean-types, infrastructure beans>> and adapts to dependencies
|
||||
available on the classpath -- for JSON, XML, and others.
|
||||
|
||||
|
||||
|
||||
[[webflux-config-customize]]
|
||||
=== WebFlux config API
|
||||
[.small]#<<web.adoc#mvc-config-customize,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-config-customize, Same as in Spring MVC>>#
|
||||
|
||||
In your Java configuration, you can implement the `WebFluxConfigurer` interface,
|
||||
as the following example shows:
|
||||
@@ -3018,7 +3019,7 @@ as the following example shows:
|
||||
|
||||
[[webflux-config-conversion]]
|
||||
=== Conversion, formatting
|
||||
[.small]#<<web.adoc#mvc-config-conversion,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-config-conversion, Same as in Spring MVC>>#
|
||||
|
||||
By default, formatters for `Number` and `Date` types are installed, including support for
|
||||
the `@NumberFormat` and `@DateTimeFormat` annotations. Full support for the Joda-Time
|
||||
@@ -3043,19 +3044,20 @@ The following example shows how to register custom formatters and converters:
|
||||
----
|
||||
====
|
||||
|
||||
NOTE: See <<core.adoc#format-FormatterRegistrar-SPI,`FormatterRegistrar` SPI>>
|
||||
and the `FormattingConversionServiceFactoryBean` for more information on when to use `FormatterRegistrar` implementations.
|
||||
NOTE: See <<core.adoc#format-FormatterRegistrar-SPI, `FormatterRegistrar` SPI>>
|
||||
and the `FormattingConversionServiceFactoryBean` for more information on when to
|
||||
use `FormatterRegistrar` implementations.
|
||||
|
||||
|
||||
|
||||
[[webflux-config-validation]]
|
||||
=== Validation
|
||||
[.small]#<<web.adoc#mvc-config-validation,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-config-validation, Same as in Spring MVC>>#
|
||||
|
||||
By default, if <<core.adoc#validation-beanvalidation-overview,Bean Validation>> is present
|
||||
on the classpath (for example, the Hibernate Validator), the `LocalValidatorFactoryBean` is registered
|
||||
as a global <<core.adoc#validator,validator>> for use with `@Valid` and `Validated` on
|
||||
`@Controller` method arguments.
|
||||
By default, if <<core.adoc#validation-beanvalidation-overview, Bean Validation>> is present
|
||||
on the classpath (for example, the Hibernate Validator), the `LocalValidatorFactoryBean`
|
||||
is registered as a global <<core.adoc#validator,validator>> for use with `@Valid` and
|
||||
`Validated` on `@Controller` method arguments.
|
||||
|
||||
In your Java configuration, you can customize the global `Validator` instance,
|
||||
as the following example shows:
|
||||
@@ -3103,11 +3105,11 @@ mark it with `@Primary` in order to avoid conflict with the one declared in the
|
||||
|
||||
[[webflux-config-content-negotiation]]
|
||||
=== Content Type Resolvers
|
||||
[.small]#<<web.adoc#mvc-config-content-negotiation,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-config-content-negotiation, Same as in Spring MVC>>#
|
||||
|
||||
You can configure how Spring WebFlux determines the requested media types for
|
||||
`@Controller` instances from the request. By default, only the `Accept` header is checked, but you
|
||||
can also enable a query parameter-based strategy.
|
||||
`@Controller` instances from the request. By default, only the `Accept` header is checked,
|
||||
but you can also enable a query parameter-based strategy.
|
||||
|
||||
The following example shows how to customize the requested content type resolution:
|
||||
|
||||
@@ -3131,7 +3133,7 @@ The following example shows how to customize the requested content type resoluti
|
||||
|
||||
[[webflux-config-message-codecs]]
|
||||
=== HTTP message codecs
|
||||
[.small]#<<web.adoc#mvc-config-message-converters,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-config-message-converters, Same as in Spring MVC>>#
|
||||
|
||||
The following example shows how to customize how the request and response body are read and written:
|
||||
|
||||
@@ -3172,7 +3174,7 @@ It also automatically registers the following well-known modules if they are det
|
||||
|
||||
[[webflux-config-view-resolvers]]
|
||||
=== View Resolvers
|
||||
[.small]#<<web.adoc#mvc-config-view-resolvers,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-config-view-resolvers, Same as in Spring MVC>>#
|
||||
|
||||
The following example shows how to configure view resolution:
|
||||
|
||||
@@ -3275,7 +3277,7 @@ See <<webflux-view>> for more on the view technologies that are integrated with
|
||||
|
||||
[[webflux-config-static-resources]]
|
||||
=== Static Resources
|
||||
[.small]#<<web.adoc#mvc-config-static-resources,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-config-static-resources, Same as in Spring MVC>>#
|
||||
|
||||
This option provides a convenient way to serve static resources from a list of
|
||||
{api-spring-framework}/core/io/Resource.html[`Resource`]-based locations.
|
||||
@@ -3363,7 +3365,7 @@ match to incoming URLs without versions (for example, `/jquery/jquery.min.js` to
|
||||
|
||||
[[webflux-config-path-matching]]
|
||||
=== Path Matching
|
||||
[.small]#<<web.adoc#mvc-config-path-matching,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-config-path-matching, Same as in Spring MVC>>#
|
||||
|
||||
You can customize options related to path matching. For details on the individual options, see the
|
||||
{api-spring-framework}/web/reactive/config/PathMatchConfigurer.html[`PathMatchConfigurer`] javadoc.
|
||||
@@ -3399,7 +3401,7 @@ whether to decode the request path nor whether to remove semicolon content for
|
||||
path matching purposes.
|
||||
|
||||
Spring WebFlux also does not support suffix pattern matching, unlike in Spring MVC, where we
|
||||
are also <<web.adoc#mvc-ann-requestmapping-suffix-pattern-match,recommend>> moving away from
|
||||
are also <<web.adoc#mvc-ann-requestmapping-suffix-pattern-match, recommend>> moving away from
|
||||
reliance on it.
|
||||
====
|
||||
|
||||
@@ -3407,7 +3409,7 @@ reliance on it.
|
||||
|
||||
[[webflux-config-advanced-java]]
|
||||
=== Advanced Configuration Mode
|
||||
[.small]#<<web.adoc#mvc-config-advanced-java,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-config-advanced-java, Same as in Spring MVC>>#
|
||||
|
||||
`@EnableWebFlux` imports `DelegatingWebFluxConfiguration` that:
|
||||
|
||||
@@ -3441,7 +3443,7 @@ the classpath.
|
||||
|
||||
[[webflux-http2]]
|
||||
== HTTP/2
|
||||
[.small]#<<web.adoc#mvc-http2,Same as in Spring MVC>>#
|
||||
[.small]#<<web.adoc#mvc-http2, Same as in Spring MVC>>#
|
||||
|
||||
Servlet 4 containers are required to support HTTP/2, and Spring Framework 5 is compatible
|
||||
with Servlet API 4. From a programming model perspective, there is nothing specific that
|
||||
|
||||
@@ -15,12 +15,12 @@ libraries.
|
||||
|
||||
NOTE: As of 5.0, the non-blocking, reactive `WebClient` offers a modern alternative to the
|
||||
`RestTemplate`, with efficient support for both
|
||||
<<web-reactive.adoc#webflux-client-synchronous,synchronous and asynchronous>>, as well as
|
||||
<<web-reactive.adoc#webflux-client-synchronous, synchronous and asynchronous>>, as well as
|
||||
streaming scenarios. The `RestTemplate` will be deprecated in a future version and will
|
||||
not have major new features added going forward.
|
||||
|
||||
|
||||
See <<integration.adoc#rest-client-access,REST Endpoints>> for details.
|
||||
See <<integration.adoc#rest-client-access, REST Endpoints>> for details.
|
||||
|
||||
|
||||
|
||||
@@ -41,4 +41,4 @@ In contrast to `RestTemplate`, `WebClient` supports the following:
|
||||
* Synchronous and asynchronous interactions.
|
||||
* Streaming up to or streaming down from a server.
|
||||
|
||||
See <<web-reactive.adoc#webflux-client,WebClient>> for more details.
|
||||
See <<web-reactive.adoc#webflux-client, WebClient>> for more details.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[[mvc-cors]]
|
||||
= CORS
|
||||
[.small]#<<web-reactive.adoc#webflux-cors,Same as in Spring WebFlux>>#
|
||||
[.small]#<<web-reactive.adoc#webflux-cors, Same as in Spring WebFlux>>#
|
||||
|
||||
Spring MVC lets you handle CORS (Cross-Origin Resource Sharing). This section
|
||||
describes how to do so.
|
||||
@@ -10,7 +10,7 @@ describes how to do so.
|
||||
|
||||
[[mvc-cors-intro]]
|
||||
== Introduction
|
||||
[.small]#<<web-reactive.adoc#webflux-cors-intro,Same as in Spring WebFlux>>#
|
||||
[.small]#<<web-reactive.adoc#webflux-cors-intro, Same as in Spring WebFlux>>#
|
||||
|
||||
For security reasons, browsers prohibit AJAX calls to resources outside the current origin.
|
||||
For example, you could have your bank account in one tab and evil.com in another. Scripts
|
||||
@@ -27,7 +27,7 @@ powerful workarounds based on IFRAME or JSONP.
|
||||
|
||||
[[mvc-cors-processing]]
|
||||
== Processing
|
||||
[.small]#<<web-reactive.adoc#webflux-cors-processing,Same as in Spring WebFlux>>#
|
||||
[.small]#<<web-reactive.adoc#webflux-cors-processing, Same as in Spring WebFlux>>#
|
||||
|
||||
The CORS specification distinguishes between preflight, simple, and actual requests.
|
||||
To learn how CORS works, you can read
|
||||
@@ -77,7 +77,7 @@ To learn more from the source or make advanced customizations, check the code be
|
||||
|
||||
[[mvc-cors-controller]]
|
||||
== `@CrossOrigin`
|
||||
[.small]#<<web-reactive.adoc#webflux-cors-controller,Same as in Spring WebFlux>>#
|
||||
[.small]#<<web-reactive.adoc#webflux-cors-controller, Same as in Spring WebFlux>>#
|
||||
|
||||
The {api-spring-framework}/web/bind/annotation/CrossOrigin.html[`@CrossOrigin`]
|
||||
annotation enables cross-origin requests on annotated controller methods,
|
||||
@@ -173,7 +173,7 @@ public class AccountController {
|
||||
|
||||
[[mvc-cors-global]]
|
||||
== Global Configuration
|
||||
[.small]#<<web-reactive.adoc#webflux-cors-global,Same as in Spring WebFlux>>#
|
||||
[.small]#<<web-reactive.adoc#webflux-cors-global, Same as in Spring WebFlux>>#
|
||||
|
||||
In addition to fine-grained, controller method level configuration, you probably want to
|
||||
define some global CORS configuration, too. You can set URL-based `CorsConfiguration`
|
||||
@@ -197,7 +197,7 @@ should only be used where appropriate.
|
||||
|
||||
[[mvc-cors-global-java]]
|
||||
=== Java Configuration
|
||||
[.small]#<<web-reactive.adoc#webflux-cors-global,Same as in Spring WebFlux>>#
|
||||
[.small]#<<web-reactive.adoc#webflux-cors-global, Same as in Spring WebFlux>>#
|
||||
|
||||
To enable CORS in the MVC Java config, you can use the `CorsRegistry` callback,
|
||||
as the following example shows:
|
||||
@@ -259,13 +259,13 @@ as the following example shows:
|
||||
|
||||
[[mvc-cors-filter]]
|
||||
== CORS Filter
|
||||
[.small]#<<web-reactive.adoc#webflux-cors-webfilter,Same as in Spring WebFlux>>#
|
||||
[.small]#<<web-reactive.adoc#webflux-cors-webfilter, Same as in Spring WebFlux>>#
|
||||
|
||||
You can apply CORS support through the built-in
|
||||
{api-spring-framework}/web/filter/CorsFilter.html[`CorsFilter`].
|
||||
|
||||
NOTE: If you try to use the `CorsFilter` with Spring Security, keep in mind that Spring
|
||||
Security has
|
||||
NOTE: If you try to use the `CorsFilter` with Spring Security, keep in mind that
|
||||
Spring Security has
|
||||
https://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#cors[built-in support]
|
||||
for CORS.
|
||||
|
||||
|
||||
@@ -1,26 +1,26 @@
|
||||
[[testing]]
|
||||
= Testing
|
||||
[.small]#<<web-reactive.adoc#webflux-test,Same in Spring WebFlux>>#
|
||||
[.small]#<<web-reactive.adoc#webflux-test, Same in Spring WebFlux>>#
|
||||
|
||||
This section summarizes the options available in `spring-test` for Spring MVC applications.
|
||||
|
||||
* Servlet API Mocks: Mock implementations of Servlet API contracts for unit testing controllers, filters, and
|
||||
other web components. See <<testing.adoc#mock-objects-servlet,Servlet API>> mock objects
|
||||
for more details.
|
||||
* Servlet API Mocks: Mock implementations of Servlet API contracts for unit testing controllers,
|
||||
filters, and other web components. See <<testing.adoc#mock-objects-servlet, Servlet API>>
|
||||
mock objects for more details.
|
||||
|
||||
* TestContext Framework: Support for loading Spring configuration in JUnit and TestNG tests, including efficient
|
||||
caching of the loaded configuration across test methods and support for loading a
|
||||
`WebApplicationContext` with a `MockServletContext`.
|
||||
* TestContext Framework: Support for loading Spring configuration in JUnit and TestNG tests,
|
||||
including efficient caching of the loaded configuration across test methods and support for
|
||||
loading a `WebApplicationContext` with a `MockServletContext`.
|
||||
See <<testing.adoc#testcontext-framework,TestContext Framework>> for more details.
|
||||
|
||||
* Spring MVC Test: A framework, also known as `MockMvc`, for testing annotated controllers through the
|
||||
`DispatcherServlet` (that is, supporting annotations), complete with the Spring MVC
|
||||
infrastructure but without an HTTP server. See
|
||||
<<testing.adoc#spring-mvc-test-framework,Spring MVC Test>> for more details.
|
||||
* Spring MVC Test: A framework, also known as `MockMvc`, for testing annotated controllers
|
||||
through the `DispatcherServlet` (that is, supporting annotations), complete with the
|
||||
Spring MVC infrastructure but without an HTTP server.
|
||||
See <<testing.adoc#spring-mvc-test-framework, Spring MVC Test>> for more details.
|
||||
|
||||
* Client-side REST: `spring-test` provides a `MockRestServiceServer` that you can use as a mock server for
|
||||
testing client-side code that internally uses the `RestTemplate`.
|
||||
See <<testing.adoc#spring-mvc-test-client,Client REST Tests>> for more details.
|
||||
* Client-side REST: `spring-test` provides a `MockRestServiceServer` that you can use as
|
||||
a mock server for testing client-side code that internally uses the `RestTemplate`.
|
||||
See <<testing.adoc#spring-mvc-test-client, Client REST Tests>> for more details.
|
||||
|
||||
* `WebTestClient`: Built for testing WebFlux applications, but it can also be used for
|
||||
end-to-end integration testing, to any server, over an HTTP connection. It is a
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
[[mvc-view]]
|
||||
= View Technologies
|
||||
[.small]#<<web-reactive.adoc#webflux-view,Same as in Spring WebFlux>>#
|
||||
[.small]#<<web-reactive.adoc#webflux-view, Same as in Spring WebFlux>>#
|
||||
|
||||
The use of view technologies in Spring MVC is pluggable, whether you decide to
|
||||
use Thymeleaf, Groovy Markup Templates, JSPs, or other technologies, is primarily a matter of a
|
||||
configuration change. This chapter covers view technologies integrated with Spring MVC.
|
||||
We assume you are already familiar with <<mvc-viewresolver>>.
|
||||
The use of view technologies in Spring MVC is pluggable, whether you decide to use
|
||||
Thymeleaf, Groovy Markup Templates, JSPs, or other technologies, is primarily a matter
|
||||
of a configuration change. This chapter covers view technologies integrated with
|
||||
Spring MVC. We assume you are already familiar with <<mvc-viewresolver>>.
|
||||
|
||||
|
||||
|
||||
|
||||
[[mvc-view-thymeleaf]]
|
||||
== Thymeleaf
|
||||
[.small]#<<web-reactive.adoc#webflux-view-thymeleaf,Same as in Spring WebFlux>>#
|
||||
[.small]#<<web-reactive.adoc#webflux-view-thymeleaf, Same as in Spring WebFlux>>#
|
||||
|
||||
Thymeleaf is a modern server-side Java template engine that emphasizes natural HTML
|
||||
templates that can be previewed in a browser by double-clicking, which is very helpful
|
||||
@@ -32,7 +32,7 @@ See http://www.thymeleaf.org/documentation.html[Thymeleaf+Spring] for more detai
|
||||
|
||||
[[mvc-view-freemarker]]
|
||||
== FreeMarker
|
||||
[.small]#<<web-reactive.adoc#webflux-view-freemarker,Same as in Spring WebFlux>>#
|
||||
[.small]#<<web-reactive.adoc#webflux-view-freemarker, Same as in Spring WebFlux>>#
|
||||
|
||||
http://www.freemarker.org[Apache FreeMarker] is a template engine for generating any
|
||||
kind of text output from HTML to email and others. The Spring Framework has a built-in
|
||||
@@ -42,7 +42,7 @@ integration for using Spring MVC with FreeMarker templates.
|
||||
|
||||
[[mvc-view-freemarker-contextconfig]]
|
||||
=== View Configuration
|
||||
[.small]#<<web-reactive.adoc#webflux-view-freemarker-contextconfig,Same as in Spring WebFlux>>#
|
||||
[.small]#<<web-reactive.adoc#webflux-view-freemarker-contextconfig, Same as in Spring WebFlux>>#
|
||||
|
||||
The following example shows how to configure FreeMarker as a view technology:
|
||||
|
||||
@@ -111,7 +111,7 @@ of `welcome`, the resolver looks for the `/WEB-INF/freemarker/welcome.ftl` templ
|
||||
|
||||
[[mvc-views-freemarker]]
|
||||
=== FreeMarker Configuration
|
||||
[.small]#<<web-reactive.adoc#webflux-views-freemarker,Same as in Spring WebFlux>>#
|
||||
[.small]#<<web-reactive.adoc#webflux-views-freemarker, Same as in Spring WebFlux>>#
|
||||
|
||||
You can pass FreeMarker 'Settings' and 'SharedVariables' directly to the FreeMarker
|
||||
`Configuration` object (which is managed by Spring) by setting the appropriate bean properties on
|
||||
@@ -568,7 +568,7 @@ syntax. The following example shows a sample template for an HTML page:
|
||||
|
||||
[[mvc-view-script]]
|
||||
== Script Views
|
||||
[.small]#<<web-reactive.adoc#webflux-view-script,Same as in Spring WebFlux>>#
|
||||
[.small]#<<web-reactive.adoc#webflux-view-script, Same as in Spring WebFlux>>#
|
||||
|
||||
The Spring Framework has a built-in integration for using Spring MVC with any
|
||||
templating library that can run on top of the
|
||||
@@ -594,7 +594,7 @@ TIP: The basic rule for integrating any other script engine is that it must impl
|
||||
|
||||
[[mvc-view-script-dependencies]]
|
||||
=== Requirements
|
||||
[.small]#<<web-reactive.adoc#webflux-view-script-dependencies,Same as in Spring WebFlux>>#
|
||||
[.small]#<<web-reactive.adoc#webflux-view-script-dependencies, Same as in Spring WebFlux>>#
|
||||
|
||||
You need to have the script engine on your classpath, the details of which vary by script engine:
|
||||
|
||||
@@ -614,7 +614,7 @@ through http://www.webjars.org/[WebJars].
|
||||
|
||||
[[mvc-view-script-integrate]]
|
||||
=== Script Templates
|
||||
[.small]#<<web-reactive.adoc#webflux-script-integrate,Same as in Spring WebFlux>>#
|
||||
[.small]#<<web-reactive.adoc#webflux-script-integrate, Same as in Spring WebFlux>>#
|
||||
|
||||
You can declare a `ScriptTemplateConfigurer` bean to specify the script engine to use,
|
||||
the script files to load, what function to call to render templates, and so on.
|
||||
@@ -1192,13 +1192,13 @@ but with different values, as the following example shows:
|
||||
|
||||
This tag renders multiple HTML `input` elements with the `type` set to `radio`.
|
||||
|
||||
As with the <<mvc-view-jsp-formtaglib-checkboxestag,`checkboxes` tag>>, you might want to pass in the available options as
|
||||
a runtime variable. For this usage, you can use the `radiobuttons` tag. You pass in an
|
||||
`Array`, a `List`, or a `Map` that contains the available options in the `items` property.
|
||||
If you use a `Map`, the map entry key is used as the value and the map
|
||||
entry's value are used as the label to be displayed. You can also use a custom
|
||||
object where you can provide the property names for the value by using `itemValue` and the
|
||||
label by using `itemLabel`, as the following example shows:
|
||||
As with the <<mvc-view-jsp-formtaglib-checkboxestag, `checkboxes` tag>>, you might want to
|
||||
pass in the available options as a runtime variable. For this usage, you can use the
|
||||
`radiobuttons` tag. You pass in an `Array`, a `List`, or a `Map` that contains the
|
||||
available options in the `items` property. If you use a `Map`, the map entry key is
|
||||
used as the value and the map entry's value are used as the label to be displayed.
|
||||
You can also use a custom object where you can provide the property names for the value
|
||||
by using `itemValue` and the label by using `itemLabel`, as the following example shows:
|
||||
|
||||
====
|
||||
[source,xml,indent=0]
|
||||
@@ -2013,7 +2013,7 @@ an external definition (by name) or as a `View` instance from the handler method
|
||||
|
||||
[[mvc-view-jackson]]
|
||||
== Jackson
|
||||
[.small]#<<web-reactive.adoc#webflux-view-httpmessagewriter,Same as in Spring WebFlux>>#
|
||||
[.small]#<<web-reactive.adoc#webflux-view-httpmessagewriter, Same as in Spring WebFlux>>#
|
||||
|
||||
Spring offers support for the Jackson JSON library.
|
||||
|
||||
@@ -2021,7 +2021,7 @@ Spring offers support for the Jackson JSON library.
|
||||
|
||||
[[mvc-view-json-mapping]]
|
||||
=== Jackson-based JSON MVC Views
|
||||
[.small]#<<web-reactive.adoc#webflux-view-httpmessagewriter,Same as in Spring WebFlux>>#
|
||||
[.small]#<<web-reactive.adoc#webflux-view-httpmessagewriter, Same as in Spring WebFlux>>#
|
||||
|
||||
The `MappingJackson2JsonView` uses the Jackson library's `ObjectMapper` to render the response
|
||||
content as JSON. By default, the entire contents of the model map (with the exception of
|
||||
@@ -2040,7 +2040,7 @@ serializers and deserializers for specific types.
|
||||
|
||||
[[mvc-view-xml-mapping]]
|
||||
=== Jackson-based XML Views
|
||||
[.small]#<<web-reactive.adoc#webflux-view-httpmessagewriter,Same as in Spring WebFlux>>#
|
||||
[.small]#<<web-reactive.adoc#webflux-view-httpmessagewriter, Same as in Spring WebFlux>>#
|
||||
|
||||
`MappingJackson2XmlView` uses the
|
||||
https://github.com/FasterXML/jackson-dataformat-xml[Jackson XML extension's] `XmlMapper`
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
||||
[[websocket]]
|
||||
= WebSockets
|
||||
:doc-spring-security: {doc-root}/spring-security/site/docs/current/reference
|
||||
[.small]#<<web-reactive.adoc#webflux-websocket,Same as in Spring WebFlux>>#
|
||||
[.small]#<<web-reactive.adoc#webflux-websocket, Same as in Spring WebFlux>>#
|
||||
|
||||
This part of the reference documentation covers support for Servlet stack, WebSocket
|
||||
messaging that includes raw WebSocket interactions, WebSocket emulation through SockJS, and
|
||||
@@ -14,7 +14,7 @@ include::websocket-intro.adoc[leveloffset=+1]
|
||||
|
||||
[[websocket-server]]
|
||||
== WebSocket API
|
||||
[.small]#<<web-reactive.adoc#webflux-websocket-server,Same as in Spring WebFlux>>#
|
||||
[.small]#<<web-reactive.adoc#webflux-websocket-server, Same as in Spring WebFlux>>#
|
||||
|
||||
The Spring Framework provides a WebSocket API that you can use to write client- and
|
||||
server-side applications that handle WebSocket messages.
|
||||
@@ -23,7 +23,7 @@ server-side applications that handle WebSocket messages.
|
||||
|
||||
[[websocket-server-handler]]
|
||||
=== `WebSocketHandler`
|
||||
[.small]#<<web-reactive.adoc#webflux-websocket-server-handler,Same as in Spring WebFlux>>#
|
||||
[.small]#<<web-reactive.adoc#webflux-websocket-server-handler, Same as in Spring WebFlux>>#
|
||||
|
||||
Creating a WebSocket server is as simple as implementing `WebSocketHandler` or, more
|
||||
likely, extending either `TextWebSocketHandler` or `BinaryWebSocketHandler`. The following
|
||||
@@ -102,10 +102,10 @@ The following example shows the XML configuration equivalent of the preceding ex
|
||||
----
|
||||
====
|
||||
|
||||
The preceding example is for use in Spring MVC applications and should be included in the
|
||||
configuration of a <<mvc-servlet,`DispatcherServlet`>>. However, Spring's WebSocket
|
||||
support does not depend on Spring MVC. It is relatively simple to integrate a `WebSocketHandler`
|
||||
into other HTTP-serving environments with the help of
|
||||
The preceding example is for use in Spring MVC applications and should be included
|
||||
in the configuration of a <<mvc-servlet, `DispatcherServlet`>>. However, Spring's
|
||||
WebSocket support does not depend on Spring MVC. It is relatively simple to
|
||||
integrate a `WebSocketHandler` into other HTTP-serving environments with the help of
|
||||
{api-spring-framework}/web/socket/server/support/WebSocketHttpRequestHandler.html[`WebSocketHttpRequestHandler`].
|
||||
|
||||
When using the `WebSocketHandler` API directly vs indirectly, e.g. through the
|
||||
@@ -118,7 +118,7 @@ sending. One option is to wrap the `WebSocketSession` with
|
||||
|
||||
[[websocket-server-handshake]]
|
||||
=== WebSocket Handshake
|
||||
[.small]#<<web-reactive.adoc#webflux-websocket-server-handshake,Same as in Spring WebFlux>>#
|
||||
[.small]#<<web-reactive.adoc#webflux-websocket-server-handshake, Same as in Spring WebFlux>>#
|
||||
|
||||
The easiest way to customize the initial HTTP WebSocket handshake request is through
|
||||
a `HandshakeInterceptor`, which exposes methods for "`before`" and "`after`" the handshake.
|
||||
@@ -272,7 +272,7 @@ Java initialization API. The following example shows how to do so:
|
||||
|
||||
[[websocket-server-runtime-configuration]]
|
||||
=== Server Configuration
|
||||
[.small]#<<web-reactive.adoc#webflux-websocket-server-config,Same as in Spring WebFlux>>#
|
||||
[.small]#<<web-reactive.adoc#webflux-websocket-server-config, Same as in Spring WebFlux>>#
|
||||
|
||||
Each underlying WebSocket engine exposes configuration properties that control
|
||||
runtime characteristics, such as the size of message buffer sizes, idle timeout,
|
||||
@@ -407,7 +407,7 @@ The following example shows the XML configuration equivalent of the preceding ex
|
||||
|
||||
[[websocket-server-allowed-origins]]
|
||||
=== Allowed Origins
|
||||
[.small]#<<web-reactive.adoc#webflux-websocket-server-cors,Same as in Spring WebFlux>>#
|
||||
[.small]#<<web-reactive.adoc#webflux-websocket-server-cors, Same as in Spring WebFlux>>#
|
||||
|
||||
As of Spring Framework 4.1.5, the default behavior for WebSocket and SockJS is to accept
|
||||
only same-origin requests. It is also possible to allow all or a specified list of origins.
|
||||
@@ -621,7 +621,7 @@ The following example shows the XML configuration equivalent of the preceding ex
|
||||
====
|
||||
|
||||
The preceding example is for use in Spring MVC applications and should be included in the
|
||||
configuration of a <<mvc-servlet,`DispatcherServlet`>>. However, Spring's WebSocket
|
||||
configuration of a <<mvc-servlet, `DispatcherServlet`>>. However, Spring's WebSocket
|
||||
and SockJS support does not depend on Spring MVC. It is relatively simple to
|
||||
integrate into other HTTP serving environments with the help of
|
||||
{api-spring-framework}/web/socket/sockjs/support/SockJsHttpRequestHandler.html[`SockJsHttpRequestHandler`].
|
||||
@@ -1008,7 +1008,7 @@ made about HTTP versus raw TCP and how it lets Spring MVC and other web framewor
|
||||
provide rich functionality. The following is a list of benefits:
|
||||
|
||||
* No need to invent a custom messaging protocol and message format.
|
||||
* STOMP clients, including a <<websocket-stomp-client,Java client>>
|
||||
* STOMP clients, including a <<websocket-stomp-client, Java client>>
|
||||
in the Spring Framework, are available.
|
||||
* You can (optionally) use message brokers (such as RabbitMQ, ActiveMQ, and others) to
|
||||
manage subscriptions and broadcast messages.
|
||||
@@ -1125,10 +1125,10 @@ Alternatively, if you connect through WebSocket (without SockJS), you can use th
|
||||
----
|
||||
====
|
||||
|
||||
Note that `stompClient` in the preceding example does not need to specify `login` and `passcode` headers.
|
||||
Even if it did, they would be ignored (or, rather, overridden) on the server side. See
|
||||
<<websocket-stomp-handle-broker-relay-configure>> and
|
||||
<<websocket-stomp-authentication>> for more information on authentication.
|
||||
Note that `stompClient` in the preceding example does not need to specify `login`
|
||||
and `passcode` headers. Even if it did, they would be ignored (or, rather,
|
||||
overridden) on the server side. See <<websocket-stomp-handle-broker-relay-configure>>
|
||||
and <<websocket-stomp-authentication>> for more information on authentication.
|
||||
|
||||
For more example code see:
|
||||
|
||||
@@ -1255,7 +1255,6 @@ We can trace the flow through a simple example. Consider the following example,
|
||||
registry.setApplicationDestinationPrefixes("/app");
|
||||
registry.enableSimpleBroker("/topic");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Controller
|
||||
@@ -1265,9 +1264,7 @@ We can trace the flow through a simple example. Consider the following example,
|
||||
public String handle(String greeting) {
|
||||
return "[" + getTimestamp() + ": " + greeting;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
----
|
||||
====
|
||||
|
||||
@@ -1316,9 +1313,10 @@ level, `@MessageMapping` is used to express shared mappings across all methods i
|
||||
controller.
|
||||
|
||||
By default, the mapping values are Ant-style path patterns (for example `/thing*`, `/thing/**`),
|
||||
including support for template variables (for example, `/thing/{id}`). The values can be referenced through
|
||||
`@DestinationVariable` method arguments. Applications can also switch to a dot-separated
|
||||
destination convention for mappings, as explained in <<websocket-stomp-destination-separator>>.
|
||||
including support for template variables (for example, `/thing/{id}`). The values can be
|
||||
referenced through `@DestinationVariable` method arguments. Applications can also switch to
|
||||
a dot-separated destination convention for mappings, as explained in
|
||||
<<websocket-stomp-destination-separator>>.
|
||||
|
||||
===== Supported Method Arguments
|
||||
|
||||
@@ -1396,7 +1394,7 @@ See <<websocket-stomp-handle-send>>.
|
||||
|
||||
`@SubscribeMapping` is similar to `@MessageMapping` but narrows the mapping to
|
||||
subscription messages only. It supports the same
|
||||
<<websocket-stomp-message-mapping,method arguments>> as `@MessageMapping`. However
|
||||
<<websocket-stomp-message-mapping, method arguments>> as `@MessageMapping`. However
|
||||
for the return value, by default, a message is sent directly to the client (through
|
||||
`clientOutboundChannel`, in response to the subscription) and not to the broker (through
|
||||
`brokerChannel`, as a broadcast to matching subscriptions). Adding `@SendTo` or
|
||||
@@ -1407,8 +1405,8 @@ application controllers are mapped to `/app`. In this setup, the broker stores a
|
||||
subscriptions to `/topic` and `/queue` that are intended for repeated broadcasts, and
|
||||
there is no need for the application to get involved. A client could also also subscribe to
|
||||
some `/app` destination, and a controller could return a value in response to that
|
||||
subscription without involving the broker
|
||||
without storing or using the subscription again (effectively a one-time request-reply exchange). One use case for this is populating a UI
|
||||
subscription without involving the broker without storing or using the subscription again
|
||||
(effectively a one-time request-reply exchange). One use case for this is populating a UI
|
||||
with initial data on startup.
|
||||
|
||||
When is this not useful? Do not try to map broker and controllers to the same destination
|
||||
@@ -1440,7 +1438,7 @@ receipt if the server supports it (simple broker does not). For example, with th
|
||||
----
|
||||
====
|
||||
|
||||
A server side option is <<websocket-stomp-interceptors,to register>> an
|
||||
A server side option is <<websocket-stomp-interceptors, to register>> an
|
||||
`ExecutorChannelInterceptor` on the `brokerChannel` and implement the `afterMessageHandled`
|
||||
method that is invoked after messages, including subscriptions, have been handled.
|
||||
|
||||
@@ -1471,13 +1469,15 @@ The following example declares an exception through a method argument:
|
||||
----
|
||||
====
|
||||
|
||||
`@MessageExceptionHandler` methods support flexible method signatures and support the same
|
||||
method argument types and return values as <<websocket-stomp-message-mapping,`@MessageMapping`>> methods.
|
||||
`@MessageExceptionHandler` methods support flexible method signatures and support
|
||||
the same method argument types and return values as
|
||||
<<websocket-stomp-message-mapping, `@MessageMapping`>> methods.
|
||||
|
||||
Typically, `@MessageExceptionHandler` methods apply within the `@Controller` class (or
|
||||
class hierarchy) in which they are declared. If you want such methods to apply more globally
|
||||
(across controllers), you can declare them in a class marked with `@ControllerAdvice`.
|
||||
This is comparable to <<web.adoc#mvc-ann-controller-advice,the similar support>> that is available in Spring MVC.
|
||||
Typically, `@MessageExceptionHandler` methods apply within the `@Controller` class
|
||||
(or class hierarchy) in which they are declared. If you want such methods to apply
|
||||
more globally (across controllers), you can declare them in a class marked with
|
||||
`@ControllerAdvice`. This is comparable to the
|
||||
<<web.adoc#mvc-ann-controller-advice, similar support>> available in Spring MVC.
|
||||
|
||||
|
||||
|
||||
@@ -1634,10 +1634,10 @@ The following example shows the XML configuration equivalent of the preceding ex
|
||||
The STOMP broker relay in the preceding configuration is a Spring
|
||||
{api-spring-framework}/messaging/MessageHandler.html[`MessageHandler`]
|
||||
that handles messages by forwarding them to an external message broker.
|
||||
To do so, it establishes TCP connections to the broker, forwards all
|
||||
messages to it, and then forwards all messages received
|
||||
from the broker to clients through their WebSocket sessions. Essentially,
|
||||
it acts as a "`relay`" that forwards messages in both directions.
|
||||
To do so, it establishes TCP connections to the broker, forwards all messages to it,
|
||||
and then forwards all messages received from the broker to clients through their
|
||||
WebSocket sessions. Essentially, it acts as a "`relay`" that forwards messages
|
||||
in both directions.
|
||||
|
||||
NOTE: Add `io.projectreactor.netty:reactor-netty` and `io.netty:netty-all`
|
||||
dependencies to your project for TCP connection management.
|
||||
@@ -2231,7 +2231,8 @@ since that is also an implementation of `WebSocketClient`. The `SockJsClient` ca
|
||||
use WebSocket or HTTP-based transport as a fallback. For more details, see
|
||||
<<websocket-fallback-sockjs-client>>.
|
||||
|
||||
Next, you can establish a connection and provide a handler for the STOMP session, as the following example shows:
|
||||
Next, you can establish a connection and provide a handler for the STOMP session,
|
||||
as the following example shows:
|
||||
|
||||
====
|
||||
[source,java,indent=0]
|
||||
|
||||
Reference in New Issue
Block a user