From 8400150a6dd66c32cad3edc8e8be4918c2777aca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Basl=C3=A9?= Date: Thu, 15 Dec 2022 15:01:55 +0100 Subject: [PATCH 01/10] Remove mention that users could be on Java < 5 --- framework-docs/src/docs/asciidoc/core/core-aop.adoc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/framework-docs/src/docs/asciidoc/core/core-aop.adoc b/framework-docs/src/docs/asciidoc/core/core-aop.adoc index 61d2135f7ab5..fc2dea6749cb 100644 --- a/framework-docs/src/docs/asciidoc/core/core-aop.adoc +++ b/framework-docs/src/docs/asciidoc/core/core-aop.adoc @@ -2920,8 +2920,7 @@ AspectJ. You also need to use AspectJ if you wish to advise join points other th simple method executions (for example, field get or set join points and so on). When you use AspectJ, you have the choice of the AspectJ language syntax (also known as -the "`code style`") or the @AspectJ annotation style. Clearly, if you do not use Java -5+, the choice has been made for you: Use the code style. If aspects play a large +the "`code style`") or the @AspectJ annotation style. If aspects play a large role in your design, and you are able to use the https://www.eclipse.org/ajdt/[AspectJ Development Tools (AJDT)] plugin for Eclipse, the AspectJ language syntax is the preferred option. It is cleaner and simpler because the language was purposefully From 4bcc1f3409a669295f4c66769888d4648b5b2d2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Basl=C3=A9?= Date: Thu, 15 Dec 2022 15:03:38 +0100 Subject: [PATCH 02/10] Fix typo 'can can' --- framework-docs/src/docs/asciidoc/data-access.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework-docs/src/docs/asciidoc/data-access.adoc b/framework-docs/src/docs/asciidoc/data-access.adoc index fb847f14cb64..b3255cf3f9f8 100644 --- a/framework-docs/src/docs/asciidoc/data-access.adoc +++ b/framework-docs/src/docs/asciidoc/data-access.adoc @@ -6850,7 +6850,7 @@ Without specifying further mapping details, queries return tabular results as `Map` whose keys are case-insensitive column names that map to their column value. You can take control over result mapping by supplying a `Function` that gets -called for each `Row` so it can can return arbitrary values (singular values, +called for each `Row` so it can return arbitrary values (singular values, collections and maps, and objects). The following example extracts the `name` column and emits its value: @@ -7212,7 +7212,7 @@ responsibility of the administrator who sets up the `ConnectionFactory`. You most likely fill both roles as you develop and test code, but you do not necessarily have to know how the production data source is configured. -When you use Spring's R2DBC layer, you can can configure your own with a +When you use Spring's R2DBC layer, you can configure your own with a connection pool implementation provided by a third party. A popular implementation is R2DBC Pool (`r2dbc-pool`). Implementations in the Spring distribution are meant only for testing purposes and do not provide pooling. From 355bade66e768ff293dac58c2c3dc455e2484b1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Basl=C3=A9?= Date: Thu, 15 Dec 2022 15:15:28 +0100 Subject: [PATCH 03/10] Rework linking to Sprinv MVC Async support vs WebFlux section The link would be named "Compared to WebFlux", which is easy to mix up with the various links to equivalent sections in the WebFlux chapter. Here the links point to a small section comparing the Servlet Async API to the WebFlux stack from a high perspective. In this commit we eliminate most of these links, except at the beginning of the Asynchronous section. We also add a small mention of the Servlet configuration in the comparison paragraphs, as Configuring section is the one furthest from the comparison paragraphs that used to have a link to it. --- framework-docs/jffi8288877985982462355.dylib | Bin 0 -> 172830 bytes .../src/docs/asciidoc/web/webmvc.adoc | 11 ++++------- 2 files changed, 4 insertions(+), 7 deletions(-) create mode 100644 framework-docs/jffi8288877985982462355.dylib diff --git a/framework-docs/jffi8288877985982462355.dylib b/framework-docs/jffi8288877985982462355.dylib new file mode 100644 index 0000000000000000000000000000000000000000..56a50d8c3c0fd0e7c96b453a5c37eaf480d6ab79 GIT binary patch literal 172830 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 literal 0 HcmV?d00001 diff --git a/framework-docs/src/docs/asciidoc/web/webmvc.adoc b/framework-docs/src/docs/asciidoc/web/webmvc.adoc index 46c2435b6519..be84a97bfd35 100644 --- a/framework-docs/src/docs/asciidoc/web/webmvc.adoc +++ b/framework-docs/src/docs/asciidoc/web/webmvc.adoc @@ -4366,7 +4366,6 @@ capital letters of the class and the method name (for example, the `getThing` me [[mvc-ann-async]] == Asynchronous Requests -[.small]#<># Spring MVC has an extensive integration with Servlet asynchronous request <>: @@ -4379,11 +4378,10 @@ return value. * Controllers can use reactive clients and return <> for response handling. - +For an overview of how this differs from Spring WebFlux, see the <> section below. [[mvc-ann-async-deferredresult]] === `DeferredResult` -[.small]#<># Once the asynchronous request processing feature is <> in the Servlet container, controller methods can wrap any supported controller method @@ -4425,7 +4423,6 @@ example, in response to an external event (JMS message), a scheduled task, or ot [[mvc-ann-async-callable]] === `Callable` -[.small]#<># A controller can wrap any supported return value with `java.util.concurrent.Callable`, as the following example shows: @@ -4455,7 +4452,6 @@ The return value can then be obtained by running the given task through the [[mvc-ann-async-processing]] === Processing -[.small]#<># Here is a very concise overview of Servlet asynchronous request processing: @@ -4533,7 +4529,7 @@ methods for timeout and completion callbacks. [[mvc-ann-async-vs-webflux]] -==== Compared to WebFlux +==== Async Spring MVC compared to WebFlux The Servlet API was originally built for making a single pass through the Filter-Servlet chain. Asynchronous request processing lets applications exit the Filter-Servlet chain @@ -4560,6 +4556,8 @@ types in controller method arguments (for example, `@RequestBody`, `@RequestPart nor does it have any explicit support for asynchronous and reactive types as model attributes. Spring WebFlux does support all that. +Finally, from a configuration perspective the asynchronous request processing feature must be +<>. [[mvc-ann-async-http-streaming]] @@ -4809,7 +4807,6 @@ that have a built-in heartbeat mechanism. [[mvc-ann-async-configuration]] === Configuration -[.small]#<># The asynchronous request processing feature must be enabled at the Servlet container level. The MVC configuration also exposes several options for asynchronous requests. From c878044376dc3c3b37f126fcdbfd481bda6fe44a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Basl=C3=A9?= Date: Thu, 15 Dec 2022 15:47:57 +0100 Subject: [PATCH 04/10] Fix subsection style in WebFlux Concurrency Model The block title style previously used was not rendered in HTML and the title wouldn't be differentiated from the text. It was in the PDF, as italics. Introducing delimited blocks in the open (`--`) style did introduce styling, but the vertical alignment isn't great. This commit turns these block titles to actual (deep) section titles. In the final HTML, at this depth there is no numbering but bold styling is there. The PDF rendering has also be verified to have relevant style. --- framework-docs/src/docs/asciidoc/web/webflux.adoc | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/framework-docs/src/docs/asciidoc/web/webflux.adoc b/framework-docs/src/docs/asciidoc/web/webflux.adoc index 937e0a6b2965..612bb8e78ae6 100644 --- a/framework-docs/src/docs/asciidoc/web/webflux.adoc +++ b/framework-docs/src/docs/asciidoc/web/webflux.adoc @@ -248,20 +248,22 @@ current thread (and rely on callbacks instead) means that you do not need extra there are no blocking calls to absorb. +==== Invoking a Blocking API -.Invoking a Blocking API What if you do need to use a blocking library? Both Reactor and RxJava provide the `publishOn` operator to continue processing on a different thread. That means there is an easy escape hatch. Keep in mind, however, that blocking APIs are not a good fit for this concurrency model. -.Mutable State +==== Mutable State + In Reactor and RxJava, you declare logic through operators. At runtime, a reactive pipeline is formed where data is processed sequentially, in distinct stages. A key benefit of this is that it frees applications from having to protect mutable state because application code within that pipeline is never invoked concurrently. -.Threading Model +==== Threading Model + What threads should you expect to see on a server running with Spring WebFlux? * On a "`vanilla`" Spring WebFlux server (for example, no data access nor other optional @@ -285,7 +287,8 @@ specific thread pool `Scheduler` strategy. * Data access libraries and other third party dependencies can also create and use threads of their own. -.Configuring +==== Configuring + The Spring Framework does not provide support for starting and stopping <>. To configure the threading model for a server, you need to use server-specific configuration APIs, or, if you use Spring Boot, From 6cfcd2128b4410af4fabd6bae1495c0cbedd262e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Basl=C3=A9?= Date: Thu, 15 Dec 2022 15:51:40 +0100 Subject: [PATCH 05/10] Fix typo: Inn -> In --- framework-docs/src/docs/asciidoc/web/webflux.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework-docs/src/docs/asciidoc/web/webflux.adoc b/framework-docs/src/docs/asciidoc/web/webflux.adoc index 612bb8e78ae6..9cfea9a98c56 100644 --- a/framework-docs/src/docs/asciidoc/web/webflux.adoc +++ b/framework-docs/src/docs/asciidoc/web/webflux.adoc @@ -1178,7 +1178,7 @@ A `HandlerAdapter` may expose its exception handling mechanism as a `DispatchExceptionHandler` set on the `HandlerResult` it returns. When that's set, `DispatcherHandler` will also apply it to the handling of the result. -A `HandlerAdapter` may also choose to implement `DispatchExceptionHandler`. Inn that case +A `HandlerAdapter` may also choose to implement `DispatchExceptionHandler`. In that case `DispatcherHandler` will apply it to exceptions that arise before a handler is mapped, e.g. during handler mapping, or earlier, e.g. in a `WebFilter`. From 627a7ab7f4f0ed122bf41f7745a488480d9e44cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Basl=C3=A9?= Date: Thu, 15 Dec 2022 16:05:01 +0100 Subject: [PATCH 06/10] Turn plain 'WebFlux' links to 'See equivalent in the Reactive stack' --- framework-docs/jffi8288877985982462355.dylib | Bin 172830 -> 0 bytes .../asciidoc/integration/rest-clients.adoc | 2 +- .../docs/asciidoc/web/webflux-websocket.adoc | 12 +- .../src/docs/asciidoc/web/webmvc-cors.adoc | 14 +- .../docs/asciidoc/web/webmvc-functional.adoc | 12 +- .../src/docs/asciidoc/web/webmvc-test.adoc | 2 +- .../src/docs/asciidoc/web/webmvc-view.adoc | 24 +-- .../src/docs/asciidoc/web/webmvc.adoc | 156 +++++++++--------- .../src/docs/asciidoc/web/websocket.adoc | 12 +- 9 files changed, 117 insertions(+), 117 deletions(-) delete mode 100644 framework-docs/jffi8288877985982462355.dylib diff --git a/framework-docs/jffi8288877985982462355.dylib b/framework-docs/jffi8288877985982462355.dylib deleted file mode 100644 index 56a50d8c3c0fd0e7c96b453a5c37eaf480d6ab79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172830 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 diff --git a/framework-docs/src/docs/asciidoc/integration/rest-clients.adoc b/framework-docs/src/docs/asciidoc/integration/rest-clients.adoc index 44dc60cd9b6e..575f1593e44f 100644 --- a/framework-docs/src/docs/asciidoc/integration/rest-clients.adoc +++ b/framework-docs/src/docs/asciidoc/integration/rest-clients.adoc @@ -215,7 +215,7 @@ converters to use explicitly. [[rest-message-conversion]] ==== Message Conversion -[.small]#<># +[.small]#<># The `spring-web` module contains the `HttpMessageConverter` contract for reading and writing the body of HTTP requests and responses through `InputStream` and `OutputStream`. diff --git a/framework-docs/src/docs/asciidoc/web/webflux-websocket.adoc b/framework-docs/src/docs/asciidoc/web/webflux-websocket.adoc index a1fbd2a32efa..d3644cf6543a 100644 --- a/framework-docs/src/docs/asciidoc/web/webflux-websocket.adoc +++ b/framework-docs/src/docs/asciidoc/web/webflux-websocket.adoc @@ -1,6 +1,6 @@ [[webflux-websocket]] = WebSockets -[.small]#<># +[.small]#<># 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]#<># +[.small]#<># 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]#<># +[.small]#<># To create a WebSocket server, you can first create a `WebSocketHandler`. The following example shows how to do so: @@ -339,7 +339,7 @@ subsequently use `DataBufferUtils.release(dataBuffer)` when the buffers are cons [[webflux-websocket-server-handshake]] === Handshake -[.small]#<># +[.small]#<># `WebSocketHandlerAdapter` delegates to a `WebSocketService`. By default, that is an instance of `HandshakeWebSocketService`, which performs basic checks on the WebSocket request and @@ -354,7 +354,7 @@ into the attributes of the `WebSocketSession`. [[webflux-websocket-server-config]] === Server Configuration -[.small]#<># +[.small]#<># The `RequestUpgradeStrategy` for each server exposes configuration specific to the underlying WebSocket server engine. When using the WebFlux Java config you can customize @@ -408,7 +408,7 @@ only Tomcat and Jetty expose such options. [[webflux-websocket-server-cors]] === CORS -[.small]#<># +[.small]#<># The easiest way to configure CORS and restrict access to a WebSocket endpoint is to have your `WebSocketHandler` implement `CorsConfigurationSource` and return a diff --git a/framework-docs/src/docs/asciidoc/web/webmvc-cors.adoc b/framework-docs/src/docs/asciidoc/web/webmvc-cors.adoc index 1c2be4c266ee..d5a3334a965a 100644 --- a/framework-docs/src/docs/asciidoc/web/webmvc-cors.adoc +++ b/framework-docs/src/docs/asciidoc/web/webmvc-cors.adoc @@ -1,6 +1,6 @@ [[mvc-cors]] = CORS -[.small]#<># +[.small]#<># 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]#<># +[.small]#<># 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]#<># +[.small]#<># 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]#<># +[.small]#<># The {api-spring-framework}/web/bind/annotation/CrossOrigin.html[`@CrossOrigin`] annotation enables cross-origin requests on annotated controller methods, @@ -226,7 +226,7 @@ as the following example shows: [[mvc-cors-global]] == Global Configuration -[.small]#<># +[.small]#<># 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` @@ -252,7 +252,7 @@ the `allowOriginPatterns` property may be used to match to a dynamic set of orig [[mvc-cors-global-java]] === Java Configuration -[.small]#<># +[.small]#<># To enable CORS in the MVC Java config, you can use the `CorsRegistry` callback, as the following example shows: @@ -329,7 +329,7 @@ as the following example shows: [[mvc-cors-filter]] == CORS Filter -[.small]#<># +[.small]#<># You can apply CORS support through the built-in {api-spring-framework}/web/filter/CorsFilter.html[`CorsFilter`]. diff --git a/framework-docs/src/docs/asciidoc/web/webmvc-functional.adoc b/framework-docs/src/docs/asciidoc/web/webmvc-functional.adoc index 83ea766ab595..876904836804 100644 --- a/framework-docs/src/docs/asciidoc/web/webmvc-functional.adoc +++ b/framework-docs/src/docs/asciidoc/web/webmvc-functional.adoc @@ -1,6 +1,6 @@ [[webmvc-fn]] = Functional Endpoints -[.small]#<># +[.small]#<># Spring Web MVC includes WebMvc.fn, a lightweight functional programming model in which functions are used to route and handle requests and contracts are designed for immutability. @@ -12,7 +12,7 @@ the same <>. [[webmvc-fn-overview]] == Overview -[.small]#<># +[.small]#<># In WebMvc.fn, an HTTP request is handled with a `HandlerFunction`: a function that takes `ServerRequest` and returns a `ServerResponse`. @@ -111,7 +111,7 @@ If you register the `RouterFunction` as a bean, for instance by exposing it in a [[webmvc-fn-handler-functions]] == HandlerFunction -[.small]#<># +[.small]#<># `ServerRequest` and `ServerResponse` are immutable interfaces that offer JDK 8-friendly access to the HTTP request and response, including headers, body, method, and status code. @@ -463,7 +463,7 @@ See <>. [[webmvc-fn-router-functions]] == `RouterFunction` -[.small]#<># +[.small]#<># Router functions are used to route the requests to the corresponding `HandlerFunction`. Typically, you do not write router functions yourself, but rather use a method on the @@ -672,7 +672,7 @@ We can further improve by using the `nest` method together with `accept`: [[webmvc-fn-running]] == Running a Server -[.small]#<># +[.small]#<># You typically run router functions in a <>-based setup through the <>, which uses Spring configuration to declare the @@ -765,7 +765,7 @@ The following example shows a WebFlux Java configuration: [[webmvc-fn-handler-filter-function]] == Filtering Handler Functions -[.small]#<># +[.small]#<># You can filter handler functions by using the `before`, `after`, or `filter` methods on the routing function builder. diff --git a/framework-docs/src/docs/asciidoc/web/webmvc-test.adoc b/framework-docs/src/docs/asciidoc/web/webmvc-test.adoc index 87b6a5387458..b4584d84a802 100644 --- a/framework-docs/src/docs/asciidoc/web/webmvc-test.adoc +++ b/framework-docs/src/docs/asciidoc/web/webmvc-test.adoc @@ -1,6 +1,6 @@ [[webmvc.test]] = Testing -[.small]#<># +[.small]#<># This section summarizes the options available in `spring-test` for Spring MVC applications. diff --git a/framework-docs/src/docs/asciidoc/web/webmvc-view.adoc b/framework-docs/src/docs/asciidoc/web/webmvc-view.adoc index b0725de35d8a..6e8ce8373426 100644 --- a/framework-docs/src/docs/asciidoc/web/webmvc-view.adoc +++ b/framework-docs/src/docs/asciidoc/web/webmvc-view.adoc @@ -1,6 +1,6 @@ [[mvc-view]] = View Technologies -[.small]#<># +[.small]#<># 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 @@ -14,7 +14,7 @@ the templates are editable by external sources, since this can have security imp [[mvc-view-thymeleaf]] == Thymeleaf -[.small]#<># +[.small]#<># 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 @@ -34,7 +34,7 @@ See https://www.thymeleaf.org/documentation.html[Thymeleaf+Spring] for more deta [[mvc-view-freemarker]] == FreeMarker -[.small]#<># +[.small]#<># https://freemarker.apache.org/[Apache FreeMarker] is a template engine for generating any kind of text output from HTML to email and others. The Spring Framework has built-in @@ -44,7 +44,7 @@ integration for using Spring MVC with FreeMarker templates. [[mvc-view-freemarker-contextconfig]] === View Configuration -[.small]#<># +[.small]#<># The following example shows how to configure FreeMarker as a view technology: @@ -125,7 +125,7 @@ returns a view name of `welcome`, the resolver looks for the [[mvc-views-freemarker]] === FreeMarker Configuration -[.small]#<># +[.small]#<># You can pass FreeMarker 'Settings' and 'SharedVariables' directly to the FreeMarker `Configuration` object (which is managed by Spring) by setting the appropriate bean @@ -164,7 +164,7 @@ with additional convenience macros for generating form input elements themselves [[mvc-view-bind-macros]] ==== The Bind Macros -[.small]#<># +[.small]#<># A standard set of macros are maintained within the `spring-webmvc.jar` file for FreeMarker, so they are always available to a suitably configured application. @@ -576,7 +576,7 @@ syntax. The following example shows a sample template for an HTML page: [[mvc-view-script]] == Script Views -[.small]#<># +[.small]#<># The Spring Framework has a built-in integration for using Spring MVC with any templating library that can run on top of the @@ -602,7 +602,7 @@ TIP: The basic rule for integrating any other script engine is that it must impl [[mvc-view-script-dependencies]] === Requirements -[.small]#<># +[.small]#<># You need to have the script engine on your classpath, the details of which vary by script engine: @@ -622,7 +622,7 @@ through https://www.webjars.org/[WebJars]. [[mvc-view-script-integrate]] === Script Templates -[.small]#<># +[.small]#<># 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. @@ -1965,7 +1965,7 @@ an external definition (by name) or as a `View` instance from the handler method [[mvc-view-jackson]] == Jackson -[.small]#<># +[.small]#<># Spring offers support for the Jackson JSON library. @@ -1973,7 +1973,7 @@ Spring offers support for the Jackson JSON library. [[mvc-view-json-mapping]] === Jackson-based JSON MVC Views -[.small]#<># +[.small]#<># 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 @@ -1992,7 +1992,7 @@ serializers and deserializers for specific types. [[mvc-view-xml-mapping]] === Jackson-based XML Views -[.small]#<># +[.small]#<># `MappingJackson2XmlView` uses the https://github.com/FasterXML/jackson-dataformat-xml[Jackson XML extension's] `XmlMapper` diff --git a/framework-docs/src/docs/asciidoc/web/webmvc.adoc b/framework-docs/src/docs/asciidoc/web/webmvc.adoc index be84a97bfd35..4bf1d8f69f00 100644 --- a/framework-docs/src/docs/asciidoc/web/webmvc.adoc +++ b/framework-docs/src/docs/asciidoc/web/webmvc.adoc @@ -23,7 +23,7 @@ https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-Versio [[mvc-servlet]] == DispatcherServlet -[.small]#<># +[.small]#<># Spring MVC, as many other web frameworks, is designed around the front controller pattern where a central `Servlet`, the `DispatcherServlet`, provides a shared algorithm @@ -240,7 +240,7 @@ TIP: If an application context hierarchy is not required, applications may confi [[mvc-servlet-special-bean-types]] === Special Bean Types -[.small]#<># +[.small]#<># The `DispatcherServlet` delegates to special beans to process requests and render the appropriate responses. By "`special beans`" we mean Spring-managed `Object` instances that @@ -300,7 +300,7 @@ The following table lists the special beans detected by the `DispatcherServlet`: [[mvc-servlet-config]] === Web MVC Config -[.small]#<># +[.small]#<># Applications can declare the infrastructure beans listed in <> that are required to process requests. The `DispatcherServlet` checks the @@ -503,7 +503,7 @@ override the `createDispatcherServlet` method. [[mvc-servlet-sequence]] === Processing -[.small]#<># +[.small]#<># The `DispatcherServlet` processes requests as follows: @@ -662,7 +662,7 @@ declare it as an <> bean or configure it directly on [[mvc-exceptionhandlers]] === Exceptions -[.small]#<># +[.small]#<># If an exception occurs during request mapping or is thrown from a request handler (such as a `@Controller`), the `DispatcherServlet` delegates to a chain of `HandlerExceptionResolver` @@ -773,7 +773,7 @@ however, use both a `WebApplicationInitializer` and a minimal `web.xml`. [[mvc-viewresolver]] === View Resolution -[.small]#<># +[.small]#<># Spring MVC defines the `ViewResolver` and `View` interfaces that let you render models in a browser without tying you to a specific view technology. `ViewResolver` @@ -825,7 +825,7 @@ The following table provides more details on the `ViewResolver` hierarchy: [[mvc-viewresolver-handling]] ==== Handling -[.small]#<># +[.small]#<># You can chain view resolvers by declaring more than one resolver bean and, if necessary, by setting the `order` property to specify ordering. Remember, the higher the order property, @@ -846,7 +846,7 @@ rendering without controller logic. [[mvc-redirecting-redirect-prefix]] ==== Redirecting -[.small]#<># +[.small]#<># The special `redirect:` prefix in a view name lets you perform a redirect. The `UrlBasedViewResolver` (and its subclasses) recognize this as an instruction that a @@ -876,7 +876,7 @@ Servlet/JSP engine. Note that you may also chain multiple view resolvers, instea [[mvc-multiple-representations]] ==== Content Negotiation -[.small]#<># +[.small]#<># {api-spring-framework}/web/servlet/view/ContentNegotiatingViewResolver.html[`ContentNegotiatingViewResolver`] does not resolve views itself but rather delegates @@ -1138,7 +1138,7 @@ request with a simple request parameter. [[mvc-multipart]] === Multipart Resolver -[.small]#<># +[.small]#<># `MultipartResolver` from the `org.springframework.web.multipart` package is a strategy for parsing multipart requests including file uploads. There is a container-based @@ -1214,7 +1214,7 @@ javadoc for details and configuration options. [[mvc-logging]] === Logging -[.small]#<># +[.small]#<># DEBUG-level logging in Spring MVC is designed to be compact, minimal, and human-friendly. It focuses on high-value bits of information that are useful over and @@ -1230,7 +1230,7 @@ not meet the stated goals, please let us know. [[mvc-logging-sensitive-data]] ==== Sensitive Data -[.small]#<># +[.small]#<># DEBUG and TRACE logging may log sensitive information. This is why request parameters and headers are masked by default and their logging in full must be enabled explicitly @@ -1294,7 +1294,7 @@ public class MyInitializer [[filters]] == Filters -[.small]#<># +[.small]#<># The `spring-web` module provides some useful filters: @@ -1321,7 +1321,7 @@ available through the `ServletRequest.getParameter{asterisk}()` family of method [[filters-forwarded-headers]] === Forwarded Headers -[.small]#<># +[.small]#<># As a request goes through proxies (such as load balancers) the host, port, and scheme may change, and that makes it a challenge to create links that point to the correct @@ -1382,7 +1382,7 @@ the filter via `web.xml` or in Spring Boot via a `FilterRegistrationBean` be sur [[filters-cors]] === CORS -[.small]#<># +[.small]#<># Spring MVC provides fine-grained support for CORS configuration through annotations on controllers. However, when used with Spring Security, we advise relying on the built-in @@ -1395,7 +1395,7 @@ See the sections on <> and the <> for more details. [[mvc-controller]] == Annotated Controllers -[.small]#<># +[.small]#<># Spring MVC provides an annotation-based programming model where `@Controller` and `@RestController` components use annotations to express request mappings, request input, @@ -1442,7 +1442,7 @@ programming model described in this section. [[mvc-ann-controller]] === Declaration -[.small]#<># +[.small]#<># You can define controller beans by using a standard Spring bean definition in the Servlet's `WebApplicationContext`. The `@Controller` stereotype allows for auto-detection, @@ -1504,7 +1504,7 @@ directly to the response body versus view resolution and rendering with an HTML [[mvc-ann-requestmapping-proxying]] ==== AOP Proxies -[.small]#<># +[.small]#<># In some cases, you may need to decorate a controller with an AOP proxy at runtime. One example is if you choose to have `@Transactional` annotations directly on the @@ -1526,7 +1526,7 @@ Please, enable class based proxying, or otherwise the interface must also have a [[mvc-ann-requestmapping]] === Request Mapping -[.small]#<># +[.small]#<># You can use the `@RequestMapping` annotation to map requests to controllers methods. It has various attributes to match by URL, HTTP method, request parameters, headers, and media @@ -1591,7 +1591,7 @@ The following example has type and method level mappings: [[mvc-ann-requestmapping-uri-templates]] ==== URI patterns -[.small]#<># +[.small]#<># `@RequestMapping` methods can be mapped using URL patterns. There are two alternatives: @@ -1713,7 +1713,7 @@ some external configuration. [[mvc-ann-requestmapping-pattern-comparison]] ==== Pattern Comparison -[.small]#<># +[.small]#<># When multiple patterns match a URL, the best match must be selected. This is done with one of the following depending on whether use of parsed `PathPattern` is enabled for use or not: @@ -1794,7 +1794,7 @@ recommendations related to RFD. [[mvc-ann-requestmapping-consumes]] ==== Consumable Media Types -[.small]#<># +[.small]#<># You can narrow the request mapping based on the `Content-Type` of the request, as the following example shows: @@ -1832,7 +1832,7 @@ TIP: `MediaType` provides constants for commonly used media types, such as [[mvc-ann-requestmapping-produces]] ==== Producible Media Types -[.small]#<># +[.small]#<># 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: @@ -1872,7 +1872,7 @@ TIP: `MediaType` provides constants for commonly used media types, such as [[mvc-ann-requestmapping-params-and-headers]] ==== Parameters, headers -[.small]#<># +[.small]#<># You can narrow request mappings based on request parameter conditions. You can test for the presence of a request parameter (`myParam`), for the absence of one (`!myParam`), or for a @@ -1927,7 +1927,7 @@ instead. [[mvc-ann-requestmapping-head-options]] ==== HTTP HEAD, OPTIONS -[.small]#<># +[.small]#<># `@GetMapping` (and `@RequestMapping(method=HttpMethod.GET)`) support HTTP HEAD transparently for request mapping. Controller methods do not need to change. @@ -1953,7 +1953,7 @@ is not necessary in the common case. [[mvc-ann-requestmapping-composed]] ==== Custom Annotations -[.small]#<># +[.small]#<># Spring MVC supports the use of <> for request mapping. Those are annotations that are themselves meta-annotated with @@ -1974,7 +1974,7 @@ you can check the custom attribute and return your own `RequestCondition`. [[mvc-ann-requestmapping-registration]] ==== Explicit Registrations -[.small]#<># +[.small]#<># You can programmatically register handler methods, which you can use for dynamic registrations or for advanced cases, such as different instances of the same handler @@ -2027,7 +2027,7 @@ under different URLs. The following example registers a handler method: [[mvc-ann-methods]] === Handler Methods -[.small]#<># +[.small]#<># `@RequestMapping` handler methods have a flexible signature and can choose from a range of supported controller method arguments and return values. @@ -2035,7 +2035,7 @@ supported controller method arguments and return values. [[mvc-ann-arguments]] ==== Method Arguments -[.small]#<># +[.small]#<># The next table describes the supported controller method arguments. Reactive types are not supported for any arguments. @@ -2176,7 +2176,7 @@ and others) and is equivalent to `required=false`. [[mvc-ann-return-types]] ==== Return Values -[.small]#<># +[.small]#<># The next table describes the supported controller method return values. Reactive types are supported for all return values. @@ -2280,7 +2280,7 @@ supported for all return values. [[mvc-ann-typeconversion]] ==== Type Conversion -[.small]#<># +[.small]#<># Some annotated controller method arguments that represent `String`-based request input (such as `@RequestParam`, `@RequestHeader`, `@PathVariable`, `@MatrixVariable`, and `@CookieValue`) @@ -2313,7 +2313,7 @@ an empty original value, so the corresponding `Missing...Exception` variants wil [[mvc-ann-matrix-variables]] ==== Matrix Variables -[.small]#<># +[.small]#<># https://tools.ietf.org/html/rfc3986#section-3.3[RFC 3986] discusses name-value pairs in path segments. In Spring MVC, we refer to those as "`matrix variables`" based on an @@ -2453,7 +2453,7 @@ you need to set a `UrlPathHelper` with `removeSemicolonContent=false` through [[mvc-ann-requestparam]] ==== `@RequestParam` -[.small]#<># +[.small]#<># You can use the `@RequestParam` annotation to bind Servlet request parameters (that is, query parameters or form data) to a method argument in a controller. @@ -2529,7 +2529,7 @@ with `@RequestParam`. [[mvc-ann-requestheader]] ==== `@RequestHeader` -[.small]#<># +[.small]#<># You can use the `@RequestHeader` annotation to bind a request header to a method argument in a controller. @@ -2590,7 +2590,7 @@ example, a method parameter annotated with `@RequestHeader("Accept")` can be of [[mvc-ann-cookievalue]] ==== `@CookieValue` -[.small]#<># +[.small]#<># You can use the `@CookieValue` annotation to bind the value of an HTTP cookie to a method argument in a controller. @@ -2630,7 +2630,7 @@ See <>. [[mvc-ann-modelattrib-method-args]] ==== `@ModelAttribute` -[.small]#<># +[.small]#<># You can use the `@ModelAttribute` annotation on a method argument to access an attribute from the model or have it be instantiated if not present. The model attribute is also overlain with @@ -2823,7 +2823,7 @@ with `@ModelAttribute`. [[mvc-ann-sessionattributes]] ==== `@SessionAttributes` -[.small]#<># +[.small]#<># `@SessionAttributes` is used to store model attributes in the HTTP Servlet session between requests. It is a type-level annotation that declares the session attributes used by a @@ -2907,7 +2907,7 @@ class EditPetForm { [[mvc-ann-sessionattribute]] ==== `@SessionAttribute` -[.small]#<># +[.small]#<># 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, @@ -2945,7 +2945,7 @@ workflow, consider using `@SessionAttributes` as described in [[mvc-ann-requestattrib]] ==== `@RequestAttribute` -[.small]#<># +[.small]#<># Similar to `@SessionAttribute`, you can use the `@RequestAttribute` annotations to access pre-existing request attributes created earlier (for example, by a Servlet `Filter` @@ -3072,7 +3072,7 @@ Therefore, we recommend that you use flash attributes mainly for redirect scenar [[mvc-multipart-forms]] ==== Multipart -[.small]#<># +[.small]#<># After a `MultipartResolver` has been <>, the content of POST requests with `multipart/form-data` is parsed and accessible as regular request @@ -3257,7 +3257,7 @@ as the following example shows: [[mvc-ann-requestbody]] ==== `@RequestBody` -[.small]#<># +[.small]#<># You can use the `@RequestBody` annotation to have the request body read and deserialized into an `Object` through an <>. @@ -3311,7 +3311,7 @@ as the following example shows: [[mvc-ann-httpentity]] ==== HttpEntity -[.small]#<># +[.small]#<># `HttpEntity` is more or less identical to using <> but is based on a container object that exposes request headers and body. The following listing shows an example: @@ -3337,7 +3337,7 @@ container object that exposes request headers and body. The following listing sh [[mvc-ann-responsebody]] ==== `@ResponseBody` -[.small]#<># +[.small]#<># You can use the `@ResponseBody` annotation on a method to have the return serialized to the response body through an @@ -3379,7 +3379,7 @@ See <> for details. [[mvc-ann-responseentity]] ==== ResponseEntity -[.small]#<># +[.small]#<># `ResponseEntity` is like <> but with status and headers. For example: @@ -3423,7 +3423,7 @@ Spring offers support for the Jackson JSON library. [[mvc-ann-jsonview]] ===== JSON Views -[.small]#<># +[.small]#<># Spring MVC provides built-in support for https://www.baeldung.com/jackson-json-view-annotation[Jackson's Serialization Views], @@ -3563,7 +3563,7 @@ to the model, as the following example shows: [[mvc-ann-modelattrib-methods]] === Model -[.small]#<># +[.small]#<># You can use the `@ModelAttribute` annotation: @@ -3661,7 +3661,7 @@ unless the return value is a `String` that would otherwise be interpreted as a v [[mvc-ann-initbinder]] === `DataBinder` -[.small]#<># +[.small]#<># `@Controller` or `@ControllerAdvice` classes can have `@InitBinder` methods that initialize instances of `WebDataBinder`, and those, in turn, can: @@ -3755,14 +3755,14 @@ controller-specific `Formatter` implementations, as the following example shows: [[mvc-ann-initbinder-model-design]] ==== Model Design -[.small]#<># +[.small]#<># include::web-data-binding-model-design.adoc[] [[mvc-ann-exceptionhandler]] === Exceptions -[.small]#<># +[.small]#<># `@Controller` and <> classes can have `@ExceptionHandler` methods to handle exceptions from controller methods, as the following example shows: @@ -3888,7 +3888,7 @@ level, <> mechanism. [[mvc-ann-exceptionhandler-args]] ==== Method Arguments -[.small]#<># +[.small]#<># `@ExceptionHandler` methods support the following arguments: @@ -3953,7 +3953,7 @@ level, <> mechanism. [[mvc-ann-exceptionhandler-return-values]] ==== Return Values -[.small]#<># +[.small]#<># `@ExceptionHandler` methods support the following return values: @@ -4023,7 +4023,7 @@ see <> [[mvc-ann-controller-advice]] === Controller Advice -[.small]#<># +[.small]#<># `@ExceptionHandler`, `@InitBinder`, and `@ModelAttribute` methods apply only to the `@Controller` class, or class hierarchy, in which they are declared. If, instead, they @@ -4087,7 +4087,7 @@ include::webmvc-functional.adoc[leveloffset=+1] [[mvc-uri-building]] == URI Links -[.small]#<># +[.small]#<># This section describes various options available in the Spring Framework to work with URI's. @@ -4562,7 +4562,7 @@ Finally, from a configuration perspective the asynchronous request processing fe [[mvc-ann-async-http-streaming]] === HTTP Streaming -[.small]#<># +[.small]#<># You can use `DeferredResult` and `Callable` for a single asynchronous return value. What if you want to produce multiple asynchronous values and have those written to the @@ -4715,7 +4715,7 @@ customize the status and headers of the response. [[mvc-ann-async-reactive-types]] === Reactive Types -[.small]#<># +[.small]#<># Spring MVC supports use of reactive client libraries in a controller (also read <> in the WebFlux section). @@ -4790,7 +4790,7 @@ Propagation library. [[mvc-ann-async-disconnects]] === Disconnects -[.small]#<># +[.small]#<># The Servlet API does not provide any notification when a remote client goes away. Therefore, while streaming to the response, whether through <> @@ -4856,7 +4856,7 @@ include::webmvc-cors.adoc[leveloffset=+1] [[mvc-ann-rest-exceptions]] == Error Responses -[.small]#<># +[.small]#<># A common requirement for REST services is to include details in the body of error responses. The Spring Framework supports the "Problem Details for HTTP APIs" @@ -4880,7 +4880,7 @@ and any `ErrorResponseException`, and renders an error response with a body. [[mvc-ann-rest-exceptions-render]] === Render -[.small]#<># +[.small]#<># You can return `ProblemDetail` or `ErrorResponse` from any `@ExceptionHandler` or from any `@RequestMapping` method to render an RFC 7807 response. This is processed as follows: @@ -4903,7 +4903,7 @@ use a protected method to map any exception to a `ProblemDetail`. [[mvc-ann-rest-exceptions-non-standard]] === Non-Standard Fields -[.small]#<># +[.small]#<># You can extend an RFC 7807 response with non-standard fields in one of two ways. @@ -4923,7 +4923,7 @@ from an existing `ProblemDetail`. This could be done centrally, e.g. from an [[mvc-ann-rest-exceptions-i18n]] === Internationalization -[.small]#<># +[.small]#<># It is a common requirement to internationalize error response details, and good practice to customize the problem details for Spring MVC exceptions. This is supported as follows: @@ -5033,7 +5033,7 @@ qualified exception class name. [[mvc-ann-rest-exceptions-client]] === Client Handling -[.small]#<># +[.small]#<># A client application can catch `WebClientResponseException`, when using the `WebClient`, or `RestClientResponseException` when using the `RestTemplate`, and use their @@ -5044,7 +5044,7 @@ or `RestClientResponseException` when using the `RestTemplate`, and use their [[mvc-web-security]] == Web Security -[.small]#<># +[.small]#<># The https://spring.io/projects/spring-security[Spring Security] project provides support for protecting web applications from malicious exploits. See the Spring Security @@ -5062,7 +5062,7 @@ https://hdiv.org/[HDIV] is another web security framework that integrates with S [[mvc-caching]] == HTTP Caching -[.small]#<># +[.small]#<># HTTP caching can significantly improve the performance of a web application. HTTP caching revolves around the `Cache-Control` response header and, subsequently, conditional request @@ -5078,7 +5078,7 @@ This section describes the HTTP caching-related options that are available in Sp [[mvc-caching-cachecontrol]] === `CacheControl` -[.small]#<># +[.small]#<># {api-spring-framework}/http/CacheControl.html[`CacheControl`] provides support for configuring settings related to the `Cache-Control` header and is accepted as an argument @@ -5134,7 +5134,7 @@ works as follows: [[mvc-caching-etag-lastmodified]] === Controllers -[.small]#<># +[.small]#<># Controllers can add explicit support for HTTP caching. We recommended doing so, since the `lastModified` or `ETag` value for a resource needs to be calculated before it can be compared @@ -5235,7 +5235,7 @@ to 412 (PRECONDITION_FAILED), to prevent concurrent modification. [[mvc-caching-static-resources]] === Static Resources -[.small]#<># +[.small]#<># You should serve static resources with a `Cache-Control` and conditional response headers for optimal performance. See the section on configuring <>. @@ -5255,7 +5255,7 @@ include::webmvc-view.adoc[leveloffset=+1] [[mvc-config]] == MVC Config -[.small]#<># +[.small]#<># The MVC Java configuration and the MVC XML namespace provide default configuration suitable for most applications and a configuration API to customize it. @@ -5271,7 +5271,7 @@ and <>. [[mvc-config-enable]] === Enable MVC Configuration -[.small]#<># +[.small]#<># In Java configuration, you can use the `@EnableWebMvc` annotation to enable MVC configuration, as the following example shows: @@ -5320,7 +5320,7 @@ available on the classpath (for example, payload converters for JSON, XML, and o [[mvc-config-customize]] === MVC Config API -[.small]#<># +[.small]#<># In Java configuration, you can implement the `WebMvcConfigurer` interface, as the following example shows: @@ -5356,7 +5356,7 @@ sub-elements are available. [[mvc-config-conversion]] === Type Conversion -[.small]#<># +[.small]#<># By default, formatters for various number and date types are installed, along with support for customization via `@NumberFormat` and `@DateTimeFormat` on fields. @@ -5471,7 +5471,7 @@ FormatterRegistrar implementations. [[mvc-config-validation]] === Validation -[.small]#<># +[.small]#<># By default, if <> is present on the classpath (for example, Hibernate Validator), the `LocalValidatorFactoryBean` is @@ -5621,7 +5621,7 @@ unwanted characters in URL paths. [[mvc-config-content-negotiation]] === Content Types -[.small]#<># +[.small]#<># You can configure how Spring MVC determines the requested media types from the request (for example, `Accept` header, URL path extension, query parameter, and others). @@ -5685,7 +5685,7 @@ The following example shows how to achieve the same configuration in XML: [[mvc-config-message-converters]] === Message Converters -[.small]#<># +[.small]#<># You can customize `HttpMessageConverter` in Java configuration by overriding {api-spring-framework}/web/servlet/config/annotation/WebMvcConfigurer.html#configureMessageConverters-java.util.List-[`configureMessageConverters()`] @@ -5838,7 +5838,7 @@ splitting URL handling across an annotated controller and a view controller. [[mvc-config-view-resolvers]] === View Resolvers -[.small]#<># +[.small]#<># The MVC configuration simplifies the registration of view resolvers. @@ -5956,7 +5956,7 @@ as the following example shows: [[mvc-config-static-resources]] === Static Resources -[.small]#<># +[.small]#<># This option provides a convenient way to serve static resources from a list of {api-spring-framework}/core/io/Resource.html[`Resource`]-based locations. @@ -6196,7 +6196,7 @@ The following example shows how to achieve the same configuration in XML: [[mvc-config-path-matching]] === Path Matching -[.small]#<># +[.small]#<># You can customize options related to path matching and treatment of the URL. For details on the individual options, see the @@ -6256,7 +6256,7 @@ The following example shows how to customize path matching in XML configuration: [[mvc-config-advanced-java]] === Advanced Java Config -[.small]#<># +[.small]#<># `@EnableWebMvc` imports `DelegatingWebMvcConfiguration`, which: @@ -6331,7 +6331,7 @@ by letting it be detected through a `` declaration. [[mvc-http2]] == HTTP/2 -[.small]#<># +[.small]#<># 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 diff --git a/framework-docs/src/docs/asciidoc/web/websocket.adoc b/framework-docs/src/docs/asciidoc/web/websocket.adoc index 16298cf136e5..48832aa3f388 100644 --- a/framework-docs/src/docs/asciidoc/web/websocket.adoc +++ b/framework-docs/src/docs/asciidoc/web/websocket.adoc @@ -1,6 +1,6 @@ [[websocket]] = WebSockets -[.small]#<># +[.small]#<># This part of the reference documentation covers support for Servlet stack, WebSocket messaging that includes raw WebSocket interactions, WebSocket emulation through SockJS, and @@ -13,7 +13,7 @@ include::websocket-intro.adoc[leveloffset=+1] [[websocket-server]] == WebSocket API -[.small]#<># +[.small]#<># The Spring Framework provides a WebSocket API that you can use to write client- and server-side applications that handle WebSocket messages. @@ -22,7 +22,7 @@ server-side applications that handle WebSocket messages. [[websocket-server-handler]] === `WebSocketHandler` -[.small]#<># +[.small]#<># Creating a WebSocket server is as simple as implementing `WebSocketHandler` or, more likely, extending either `TextWebSocketHandler` or `BinaryWebSocketHandler`. The following @@ -108,7 +108,7 @@ sending. One option is to wrap the `WebSocketSession` with [[websocket-server-handshake]] === WebSocket Handshake -[.small]#<># +[.small]#<># The easiest way to customize the initial HTTP WebSocket handshake request is through a `HandshakeInterceptor`, which exposes methods for "`before`" and "`after`" the handshake. @@ -242,7 +242,7 @@ Java initialization API. The following example shows how to do so: [[websocket-server-runtime-configuration]] === Server Configuration -[.small]#<># +[.small]#<># Each underlying WebSocket engine exposes configuration properties that control runtime characteristics, such as the size of message buffer sizes, idle timeout, @@ -365,7 +365,7 @@ The following example shows the XML configuration equivalent of the preceding ex [[websocket-server-allowed-origins]] === Allowed Origins -[.small]#<># +[.small]#<># 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. From 068f1889163c2ee4d1096a821bce5903effe5715 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Basl=C3=A9?= Date: Thu, 15 Dec 2022 16:13:25 +0100 Subject: [PATCH 07/10] Turn plain 'WebMVC' links to 'See equivalent in the Servlet stack' --- .../src/docs/asciidoc/web/webflux-cors.adoc | 12 +- .../docs/asciidoc/web/webflux-functional.adoc | 12 +- .../src/docs/asciidoc/web/webflux-view.adoc | 22 +-- .../src/docs/asciidoc/web/webflux.adoc | 156 +++++++++--------- 4 files changed, 101 insertions(+), 101 deletions(-) diff --git a/framework-docs/src/docs/asciidoc/web/webflux-cors.adoc b/framework-docs/src/docs/asciidoc/web/webflux-cors.adoc index f7744ab1f2d1..2b1fb23b78d1 100644 --- a/framework-docs/src/docs/asciidoc/web/webflux-cors.adoc +++ b/framework-docs/src/docs/asciidoc/web/webflux-cors.adoc @@ -1,6 +1,6 @@ [[webflux-cors]] = CORS -[.small]#<># +[.small]#<># 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]#<># +[.small]#<># 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]#<># +[.small]#<># 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]#<># +[.small]#<># The {api-spring-framework}/web/bind/annotation/CrossOrigin.html[`@CrossOrigin`] annotation enables cross-origin requests on annotated controller methods, as the @@ -237,7 +237,7 @@ as the following example shows: [[webflux-cors-global]] == Global Configuration -[.small]#<># +[.small]#<># 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` @@ -308,7 +308,7 @@ as the following example shows: [[webflux-cors-webfilter]] == CORS `WebFilter` -[.small]#<># +[.small]#<># You can apply CORS support through the built-in {api-spring-framework}/web/cors/reactive/CorsWebFilter.html[`CorsWebFilter`], which is a diff --git a/framework-docs/src/docs/asciidoc/web/webflux-functional.adoc b/framework-docs/src/docs/asciidoc/web/webflux-functional.adoc index 781a3f6b919d..4ebf6b429465 100644 --- a/framework-docs/src/docs/asciidoc/web/webflux-functional.adoc +++ b/framework-docs/src/docs/asciidoc/web/webflux-functional.adoc @@ -1,6 +1,6 @@ [[webflux-fn]] = Functional Endpoints -[.small]#<># +[.small]#<># Spring WebFlux includes WebFlux.fn, a lightweight functional programming model in which functions are used to route and handle requests and contracts are designed for immutability. @@ -12,7 +12,7 @@ the same <> foundation. [[webflux-fn-overview]] == Overview -[.small]#<># +[.small]#<># In WebFlux.fn, an HTTP request is handled with a `HandlerFunction`: a function that takes `ServerRequest` and returns a delayed `ServerResponse` (i.e. `Mono`). @@ -113,7 +113,7 @@ Most applications can run through the WebFlux Java configuration, see <># +[.small]#<># `ServerRequest` and `ServerResponse` are immutable interfaces that offer JDK 8-friendly access to the HTTP request and response. @@ -486,7 +486,7 @@ See <>. [[webflux-fn-router-functions]] == `RouterFunction` -[.small]#<># +[.small]#<># Router functions are used to route the requests to the corresponding `HandlerFunction`. Typically, you do not write router functions yourself, but rather use a method on the @@ -687,7 +687,7 @@ We can further improve by using the `nest` method together with `accept`: [[webflux-fn-running]] == Running a Server -[.small]#<># +[.small]#<># How do you run a router function in an HTTP server? A simple option is to convert a router function to an `HttpHandler` by using one of the following: @@ -793,7 +793,7 @@ The following example shows a WebFlux Java configuration (see [[webflux-fn-handler-filter-function]] == Filtering Handler Functions -[.small]#<># +[.small]#<># You can filter handler functions by using the `before`, `after`, or `filter` methods on the routing function builder. diff --git a/framework-docs/src/docs/asciidoc/web/webflux-view.adoc b/framework-docs/src/docs/asciidoc/web/webflux-view.adoc index 04b9f8c1a0e1..9348d3ca561b 100644 --- a/framework-docs/src/docs/asciidoc/web/webflux-view.adoc +++ b/framework-docs/src/docs/asciidoc/web/webflux-view.adoc @@ -1,6 +1,6 @@ [[webflux-view]] = View Technologies -[.small]#<># +[.small]#<># 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-view-thymeleaf]] == Thymeleaf -[.small]#<># +[.small]#<># 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 @@ https://web.archive.org/web/20210623051330/http%3A//forum.thymeleaf.org/Thymelea [[webflux-view-freemarker]] == FreeMarker -[.small]#<># +[.small]#<># https://freemarker.apache.org/[Apache FreeMarker] is a template engine for generating any kind of text output from HTML to email and others. The Spring Framework has built-in @@ -43,7 +43,7 @@ integration for using Spring WebFlux with FreeMarker templates. [[webflux-view-freemarker-contextconfig]] === View Configuration -[.small]#<># +[.small]#<># The following example shows how to configure FreeMarker as a view technology: @@ -98,7 +98,7 @@ returns the view name, `welcome`, the resolver looks for the [[webflux-views-freemarker]] === FreeMarker Configuration -[.small]#<># +[.small]#<># You can pass FreeMarker 'Settings' and 'SharedVariables' directly to the FreeMarker `Configuration` object (which is managed by Spring) by setting the appropriate bean @@ -151,7 +151,7 @@ the `Configuration` object. [[webflux-view-freemarker-forms]] === Form Handling -[.small]#<># +[.small]#<># Spring provides a tag library for use in JSPs that contains, among others, a `` element. This element primarily lets forms display values from @@ -162,7 +162,7 @@ with additional convenience macros for generating form input elements themselves [[webflux-view-bind-macros]] ==== The Bind Macros -[.small]#<># +[.small]#<># A standard set of macros are maintained within the `spring-webflux.jar` file for FreeMarker, so they are always available to a suitably configured application. @@ -193,7 +193,7 @@ sections of the Spring MVC documentation. [[webflux-view-script]] == Script Views -[.small]#<># +[.small]#<># The Spring Framework has a built-in integration for using Spring WebFlux with any templating library that can run on top of the @@ -219,7 +219,7 @@ TIP: The basic rule for integrating any other script engine is that it must impl [[webflux-view-script-dependencies]] === Requirements -[.small]#<># +[.small]#<># You need to have the script engine on your classpath, the details of which vary by script engine: @@ -239,7 +239,7 @@ through https://www.webjars.org/[WebJars]. [[webflux-view-script-integrate]] === Script Templates -[.small]#<># +[.small]#<># 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. @@ -389,7 +389,7 @@ for more configuration examples. [[webflux-view-httpmessagewriter]] == JSON and XML -[.small]#<># +[.small]#<># For <> 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), diff --git a/framework-docs/src/docs/asciidoc/web/webflux.adoc b/framework-docs/src/docs/asciidoc/web/webflux.adoc index 9cfea9a98c56..bb0f6904b0c9 100644 --- a/framework-docs/src/docs/asciidoc/web/webflux.adoc +++ b/framework-docs/src/docs/asciidoc/web/webflux.adoc @@ -597,7 +597,7 @@ The `DefaultServerWebExchange` uses the configured `HttpMessageReader` to parse [[webflux-multipart]] ==== Multipart Data -[.small]#<># +[.small]#<># `ServerWebExchange` exposes the following method for accessing multipart data: @@ -631,7 +631,7 @@ collecting to a `MultiValueMap`. [[webflux-forwarded-headers]] ==== Forwarded Headers -[.small]#<># +[.small]#<># As a request goes through proxies (such as load balancers), the host, port, and scheme may change. That makes it a challenge, from a client perspective, to create links that point to the correct @@ -662,7 +662,7 @@ filters, and `ForwardedHeaderTransformer` is used instead. [[webflux-filters]] === Filters -[.small]#<># +[.small]#<># In the <>, you can use a `WebFilter` to apply interception-style logic before and after the rest of the processing chain of filters and the target @@ -673,7 +673,7 @@ the bean declaration or by implementing `Ordered`. [[webflux-filters-cors]] ==== CORS -[.small]#<># +[.small]#<># 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 @@ -684,7 +684,7 @@ See the section on <> and the <> for more [[webflux-exception-handler]] === Exceptions -[.small]#<># +[.small]#<># In the <>, you can use a `WebExceptionHandler` to handle exceptions from the chain of `WebFilter` instances and the target `WebHandler`. When using the @@ -715,7 +715,7 @@ The following table describes the available `WebExceptionHandler` implementation [[webflux-codecs]] === Codecs -[.small]#<># +[.small]#<># 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 @@ -855,7 +855,7 @@ To configure all three in WebFlux, you'll need to supply a pre-configured instan [[webflux-codecs-streaming]] ==== Streaming -[.small]#<># +[.small]#<># When streaming to the HTTP response (for example, `text/event-stream`, `application/x-ndjson`), it is important to send data periodically, in order to @@ -883,7 +883,7 @@ especially the section on <>. [[webflux-logging]] === Logging -[.small]#<># +[.small]#<># `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 @@ -915,7 +915,7 @@ while a fully formatted prefix based on that ID is available from [[webflux-logging-sensitive-data]] ==== Sensitive Data -[.small]#<># +[.small]#<># `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. @@ -1017,7 +1017,7 @@ The following example shows how to do so for client-side requests: [[webflux-dispatcher-handler]] == `DispatcherHandler` -[.small]#<># +[.small]#<># Spring WebFlux, similarly to Spring MVC, is designed around the front controller pattern, where a central `WebHandler`, the `DispatcherHandler`, provides a shared algorithm for @@ -1060,7 +1060,7 @@ The resulting `HttpHandler` is ready for use with a <># +[.small]#<># The `DispatcherHandler` delegates to special beans to process requests and render the appropriate responses. By "`special beans,`" we mean Spring-managed `Object` instances that @@ -1102,7 +1102,7 @@ there are also some other beans detected at a lower level (see [[webflux-framework-config]] === WebFlux Config -[.small]#<># +[.small]#<># Applications can declare the infrastructure beans (listed under <> and @@ -1117,7 +1117,7 @@ many extra convenient options. [[webflux-dispatcher-handler-sequence]] === Processing -[.small]#<># +[.small]#<># `DispatcherHandler` processes requests as follows: @@ -1168,7 +1168,7 @@ as a `HandlerResult`, along with some additional context, and passed to the firs [[webflux-dispatcher-exceptions]] === Exceptions -[.small]#<># +[.small]#<># `HandlerAdapter` implementations can handle internally exceptions from invoking a request handler, such as a controller method. However, an exception may be deferred if the request @@ -1189,7 +1189,7 @@ See also <> in the "`Annotated Controller`" s [[webflux-viewresolution]] === View Resolution -[.small]#<># +[.small]#<># 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 @@ -1200,7 +1200,7 @@ instance. The `View` is then used to render the response. [[webflux-viewresolution-handling]] ==== Handling -[.small]#<># +[.small]#<># The `HandlerResult` passed into `ViewResolutionResultHandler` contains the return value from the handler and the model that contains attributes added during request @@ -1236,7 +1236,7 @@ See <> for more on the view technologies integrated with Spring We [[webflux-redirecting-redirect-prefix]] ==== Redirecting -[.small]#<># +[.small]#<># 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 @@ -1251,7 +1251,7 @@ operate in terms of logical view names. A view name such as [[webflux-multiple-representations]] ==== Content Negotiation -[.small]#<># +[.small]#<># `ViewResolutionResultHandler` supports content negotiation. It compares the request media types with the media types supported by each selected `View`. The first `View` @@ -1268,7 +1268,7 @@ always selected and used if they match the requested media type. [[webflux-controller]] == Annotated Controllers -[.small]#<># +[.small]#<># Spring WebFlux provides an annotation-based programming model, where `@Controller` and `@RestController` components use annotations to express request mappings, request input, @@ -1306,7 +1306,7 @@ In the preceding example, the method returns a `String` to be written to the res [[webflux-ann-controller]] === `@Controller` -[.small]#<># +[.small]#<># 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 @@ -1350,7 +1350,7 @@ directly to the response body versus view resolution and rendering with an HTML [[webflux-ann-requestmapping-proxying]] ==== AOP Proxies -[.small]#<># +[.small]#<># In some cases, you may need to decorate a controller with an AOP proxy at runtime. One example is if you choose to have `@Transactional` annotations directly on the @@ -1373,7 +1373,7 @@ Please, enable class based proxying, or otherwise the interface must also have a [[webflux-ann-requestmapping]] === Request Mapping -[.small]#<># +[.small]#<># 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 @@ -1437,7 +1437,7 @@ The following example uses type and method level mappings: [[webflux-ann-requestmapping-uri-templates]] ==== URI Patterns -[.small]#<># +[.small]#<># You can map requests by using glob patterns and wildcards: @@ -1586,7 +1586,7 @@ explicit, and less vulnerable to URL path based exploits. [[webflux-ann-requestmapping-pattern-comparison]] ==== Pattern Comparison -[.small]#<># +[.small]#<># 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. @@ -1601,7 +1601,7 @@ sorted last instead. If two patterns are both catch-all, the longer is chosen. [[webflux-ann-requestmapping-consumes]] ==== Consumable Media Types -[.small]#<># +[.small]#<># You can narrow the request mapping based on the `Content-Type` of the request, as the following example shows: @@ -1636,7 +1636,7 @@ TIP: `MediaType` provides constants for commonly used media types -- for example [[webflux-ann-requestmapping-produces]] ==== Producible Media Types -[.small]#<># +[.small]#<># 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: @@ -1673,7 +1673,7 @@ TIP: `MediaType` provides constants for commonly used media types -- e.g. [[webflux-ann-requestmapping-params-and-headers]] ==== Parameters and Headers -[.small]#<># +[.small]#<># 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 @@ -1725,7 +1725,7 @@ You can also use the same with request header conditions, as the following examp [[webflux-ann-requestmapping-head-options]] ==== HTTP HEAD, OPTIONS -[.small]#<># +[.small]#<># `@GetMapping` and `@RequestMapping(method=HttpMethod.GET)` support HTTP HEAD transparently for request mapping purposes. Controller methods need not change. @@ -1746,7 +1746,7 @@ is not necessary in the common case. [[webflux-ann-requestmapping-composed]] ==== Custom Annotations -[.small]#<># +[.small]#<># Spring WebFlux supports the use of <> for request mapping. Those are annotations that are themselves meta-annotated with @@ -1767,7 +1767,7 @@ you can check the custom attribute and return your own `RequestCondition`. [[webflux-ann-requestmapping-registration]] ==== Explicit Registrations -[.small]#<># +[.small]#<># 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 @@ -1824,7 +1824,7 @@ under different URLs. The following example shows how to do so: [[webflux-ann-methods]] === Handler Methods -[.small]#<># +[.small]#<># `@RequestMapping` handler methods have a flexible signature and can choose from a range of supported controller method arguments and return values. @@ -1832,7 +1832,7 @@ supported controller method arguments and return values. [[webflux-ann-arguments]] ==== Method Arguments -[.small]#<># +[.small]#<># The following table shows the supported controller method arguments. @@ -1952,7 +1952,7 @@ and others) and is equivalent to `required=false`. [[webflux-ann-return-types]] ==== Return Values -[.small]#<># +[.small]#<># The following table shows the supported controller method return values. Note that reactive types from libraries such as Reactor, RxJava, <> are @@ -2033,7 +2033,7 @@ generally supported for all return values. [[webflux-ann-typeconversion]] ==== Type Conversion -[.small]#<># +[.small]#<># Some annotated controller method arguments that represent String-based request input (for example, `@RequestParam`, `@RequestHeader`, `@PathVariable`, `@MatrixVariable`, and `@CookieValue`) @@ -2053,7 +2053,7 @@ argument as `@Nullable`. [[webflux-ann-matrix-variables]] ==== Matrix Variables -[.small]#<># +[.small]#<># https://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 @@ -2188,7 +2188,7 @@ To get all matrix variables, use a `MultiValueMap`, as the following example sho [[webflux-ann-requestparam]] ==== `@RequestParam` -[.small]#<># +[.small]#<># You can use the `@RequestParam` annotation to bind query parameters to a method argument in a controller. The following code snippet shows the usage: @@ -2263,7 +2263,7 @@ with `@RequestParam`. [[webflux-ann-requestheader]] ==== `@RequestHeader` -[.small]#<># +[.small]#<># You can use the `@RequestHeader` annotation to bind a request header to a method argument in a controller. @@ -2324,7 +2324,7 @@ example, a method parameter annotated with `@RequestHeader("Accept")` may be of [[webflux-ann-cookievalue]] ==== `@CookieValue` -[.small]#<># +[.small]#<># You can use the `@CookieValue` annotation to bind the value of an HTTP cookie to a method argument in a controller. @@ -2365,7 +2365,7 @@ Type conversion is applied automatically if the target method parameter type is [[webflux-ann-modelattrib-method-args]] ==== `@ModelAttribute` -[.small]#<># +[.small]#<># 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 overlaid with @@ -2512,7 +2512,7 @@ with `@ModelAttribute`. [[webflux-ann-sessionattributes]] ==== `@SessionAttributes` -[.small]#<># +[.small]#<># `@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 @@ -2597,7 +2597,7 @@ as the following example shows: [[webflux-ann-sessionattribute]] ==== `@SessionAttribute` -[.small]#<># +[.small]#<># 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, @@ -2633,7 +2633,7 @@ workflow, consider using `SessionAttributes`, as described in [[webflux-ann-requestattrib]] ==== `@RequestAttribute` -[.small]#<># +[.small]#<># Similarly to `@SessionAttribute`, you can use the `@RequestAttribute` annotation to access pre-existing request attributes created earlier (for example, by a `WebFilter`), @@ -2662,7 +2662,7 @@ as the following example shows: [[webflux-multipart-forms]] ==== Multipart Content -[.small]#<># +[.small]#<># As explained in <>, `ServerWebExchange` provides access to multipart content. The best way to handle a file upload form (for example, from a browser) in a controller @@ -2939,7 +2939,7 @@ See <>. [[webflux-ann-requestbody]] ==== `@RequestBody` -[.small]#<># +[.small]#<># You can use the `@RequestBody` annotation to have the request body read and deserialized into an `Object` through an <>. @@ -3013,7 +3013,7 @@ related operators: [[webflux-ann-httpentity]] ==== `HttpEntity` -[.small]#<># +[.small]#<># `HttpEntity` is more or less identical to using <> but is based on a container object that exposes request headers and the body. The following example uses an @@ -3039,7 +3039,7 @@ container object that exposes request headers and the body. The following exampl [[webflux-ann-responsebody]] ==== `@ResponseBody` -[.small]#<># +[.small]#<># You can use the `@ResponseBody` annotation on a method to have the return serialized to the response body through an <>. The following @@ -3082,7 +3082,7 @@ configure or customize message writing. [[webflux-ann-responseentity]] ==== `ResponseEntity` -[.small]#<># +[.small]#<># `ResponseEntity` is like <> but with status and headers. For example: @@ -3129,7 +3129,7 @@ Spring offers support for the Jackson JSON library. [[webflux-ann-jsonview]] ===== JSON Views -[.small]#<># +[.small]#<># Spring WebFlux provides built-in support for https://www.baeldung.com/jackson-json-view-annotation[Jackson's Serialization Views], @@ -3207,7 +3207,7 @@ controller method. Use a composite interface if you need to activate multiple vi [[webflux-ann-modelattrib-methods]] === `Model` -[.small]#<># +[.small]#<># You can use the `@ModelAttribute` annotation: @@ -3346,7 +3346,7 @@ as the following example shows: [[webflux-ann-initbinder]] === `DataBinder` -[.small]#<># +[.small]#<># `@Controller` or `@ControllerAdvice` classes can have `@InitBinder` methods, to initialize instances of `WebDataBinder`. Those, in turn, are used to: @@ -3445,14 +3445,14 @@ controller-specific `Formatter` instances, as the following example shows: [[webflux-ann-initbinder-model-design]] ==== Model Design -[.small]#<># +[.small]#<># include::web-data-binding-model-design.adoc[] [[webflux-ann-controller-exceptions]] === Exceptions -[.small]#<># +[.small]#<># `@Controller` and <> classes can have `@ExceptionHandler` methods to handle exceptions from controller methods. The following @@ -3514,7 +3514,7 @@ for more detail. [[webflux-ann-exceptionhandler-args]] ==== Method Arguments -[.small]#<># +[.small]#<># `@ExceptionHandler` methods support the same <> as `@RequestMapping` methods, except the request body might have been consumed already. @@ -3523,7 +3523,7 @@ as `@RequestMapping` methods, except the request body might have been consumed a [[webflux-ann-exceptionhandler-return-values]] ==== Return Values -[.small]#<># +[.small]#<># `@ExceptionHandler` methods support the same <> as `@RequestMapping` methods. @@ -3532,7 +3532,7 @@ as `@RequestMapping` methods. [[webflux-ann-controller-advice]] === Controller Advice -[.small]#<># +[.small]#<># Typically, the `@ExceptionHandler`, `@InitBinder`, and `@ModelAttribute` methods apply within the `@Controller` class (or class hierarchy) in which they are declared. If you @@ -3600,7 +3600,7 @@ include::webflux-functional.adoc[leveloffset=+1] [[webflux-uri-building]] == URI Links -[.small]#<># +[.small]#<># This section describes various options available in the Spring Framework to prepare URIs. @@ -3611,7 +3611,7 @@ include::webflux-cors.adoc[leveloffset=+1] [[webflux-ann-rest-exceptions]] == Error Responses -[.small]#<># +[.small]#<># A common requirement for REST services is to include details in the body of error responses. The Spring Framework supports the "Problem Details for HTTP APIs" @@ -3635,7 +3635,7 @@ and any `ErrorResponseException`, and renders an error response with a body. [[webflux-ann-rest-exceptions-render]] === Render -[.small]#<># +[.small]#<># You can return `ProblemDetail` or `ErrorResponse` from any `@ExceptionHandler` or from any `@RequestMapping` method to render an RFC 7807 response. This is processed as follows: @@ -3658,7 +3658,7 @@ use a protected method to map any exception to a `ProblemDetail`. [[webflux-ann-rest-exceptions-non-standard]] === Non-Standard Fields -[.small]#<># +[.small]#<># You can extend an RFC 7807 response with non-standard fields in one of two ways. @@ -3678,7 +3678,7 @@ from an existing `ProblemDetail`. This could be done centrally, e.g. from an [[webflux-ann-rest-exceptions-i18n]] === Internationalization -[.small]#<># +[.small]#<># It is a common requirement to internationalize error response details, and good practice to customize the problem details for Spring WebFlux exceptions. This is supported as follows: @@ -3749,7 +3749,7 @@ qualified exception class name. [[webflux-ann-rest-exceptions-client]] === Client Handling -[.small]#<># +[.small]#<># A client application can catch `WebClientResponseException`, when using the `WebClient`, or `RestClientResponseException` when using the `RestTemplate`, and use their @@ -3761,7 +3761,7 @@ or `RestClientResponseException` when using the `RestTemplate`, and use their [[webflux-web-security]] == Web Security -[.small]#<># +[.small]#<># The https://spring.io/projects/spring-security[Spring Security] project provides support for protecting web applications from malicious exploits. See the Spring Security @@ -3777,7 +3777,7 @@ reference documentation, including: [[webflux-caching]] == HTTP Caching -[.small]#<># +[.small]#<># HTTP caching can significantly improve the performance of a web application. HTTP caching revolves around the `Cache-Control` response header and subsequent conditional request @@ -3793,7 +3793,7 @@ This section describes the HTTP caching related options available in Spring WebF [[webflux-caching-cachecontrol]] === `CacheControl` -[.small]#<># +[.small]#<># {api-spring-framework}/http/CacheControl.html[`CacheControl`] provides support for configuring settings related to the `Cache-Control` header and is accepted as an argument @@ -3841,7 +3841,7 @@ use case-oriented approach that focuses on the common scenarios, as the followin [[webflux-caching-etag-lastmodified]] === Controllers -[.small]#<># +[.small]#<># 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 @@ -3942,7 +3942,7 @@ to 412 (PRECONDITION_FAILED) to prevent concurrent modification. [[webflux-caching-static-resources]] === Static Resources -[.small]#<># +[.small]#<># You should serve static resources with a `Cache-Control` and conditional response headers for optimal performance. See the section on configuring <>. @@ -3953,7 +3953,7 @@ include::webflux-view.adoc[leveloffset=+1] [[webflux-config]] == WebFlux Config -[.small]#<># +[.small]#<># 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 @@ -3970,7 +3970,7 @@ gain full control over the configuration through the [[webflux-config-enable]] === Enabling WebFlux Config -[.small]#<># +[.small]#<># You can use the `@EnableWebFlux` annotation in your Java config, as the following example shows: @@ -3999,7 +3999,7 @@ available on the classpath -- for JSON, XML, and others. [[webflux-config-customize]] === WebFlux config API -[.small]#<># +[.small]#<># In your Java configuration, you can implement the `WebFluxConfigurer` interface, as the following example shows: @@ -4030,7 +4030,7 @@ class WebConfig : WebFluxConfigurer { [[webflux-config-conversion]] === Conversion, formatting -[.small]#<># +[.small]#<># By default, formatters for various number and date types are installed, along with support for customization via `@NumberFormat` and `@DateTimeFormat` on fields. @@ -4107,7 +4107,7 @@ use `FormatterRegistrar` implementations. [[webflux-config-validation]] === Validation -[.small]#<># +[.small]#<># By default, if <> is present on the classpath (for example, the Hibernate Validator), the `LocalValidatorFactoryBean` @@ -4182,7 +4182,7 @@ mark it with `@Primary` in order to avoid conflict with the one declared in the [[webflux-config-content-negotiation]] === Content Type Resolvers -[.small]#<># +[.small]#<># 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, @@ -4220,7 +4220,7 @@ The following example shows how to customize the requested content type resoluti [[webflux-config-message-codecs]] === HTTP message codecs -[.small]#<># +[.small]#<># The following example shows how to customize how the request and response body are read and written: @@ -4271,7 +4271,7 @@ It also automatically registers the following well-known modules if they are det [[webflux-config-view-resolvers]] === View Resolvers -[.small]#<># +[.small]#<># The following example shows how to configure view resolution: @@ -4428,7 +4428,7 @@ See <> for more on the view technologies that are integrated with [[webflux-config-static-resources]] === Static Resources -[.small]#<># +[.small]#<># This option provides a convenient way to serve static resources from a list of {api-spring-framework}/core/io/Resource.html[`Resource`]-based locations. @@ -4552,7 +4552,7 @@ for fine-grained control, e.g. last-modified behavior and optimized resource res [[webflux-config-path-matching]] === Path Matching -[.small]#<># +[.small]#<># 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. @@ -4653,7 +4653,7 @@ For example: [[webflux-config-advanced-java]] === Advanced Configuration Mode -[.small]#<># +[.small]#<># `@EnableWebFlux` imports `DelegatingWebFluxConfiguration` that: @@ -4693,7 +4693,7 @@ the classpath. [[webflux-http2]] == HTTP/2 -[.small]#<># +[.small]#<># HTTP/2 is supported with Reactor Netty, Tomcat, Jetty, and Undertow. However, there are considerations related to server configuration. For more details, see the From f6344f1cfe73c75f60649517953d0440668462a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Basl=C3=A9?= Date: Thu, 15 Dec 2022 16:37:07 +0100 Subject: [PATCH 08/10] Fix links to Jakarta Mail 1.6 --- framework-docs/src/docs/asciidoc/integration/email.adoc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/framework-docs/src/docs/asciidoc/integration/email.adoc b/framework-docs/src/docs/asciidoc/integration/email.adoc index f0c6581e8df0..f00e078b25c5 100644 --- a/framework-docs/src/docs/asciidoc/integration/email.adoc +++ b/framework-docs/src/docs/asciidoc/integration/email.adoc @@ -8,11 +8,12 @@ This section describes how to send email with the Spring Framework. The following JAR needs to be on the classpath of your application in order to use the Spring Framework's email library: -* The https://eclipse-ee4j.github.io/mail/[JavaMail / Jakarta Mail 1.6] library +* The https://jakartaee.github.io/mail-api/[JavaMail / Jakarta Mail 1.6] library This library is freely available on the web -- for example, in Maven Central as `com.sun.mail:jakarta.mail`. Please make sure to use the latest 1.6.x version rather than Jakarta Mail 2.0 (which comes with a different package namespace). +See the `v1.x` code in the https://github.com/jakartaee/mail-api/tree/v1.x[Jakarta Mail-Api repository]. **** The Spring Framework provides a helpful utility library for sending email that shields From d474f06bd9a7e4b7f0a092e23368a1dc21b7fc55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Basl=C3=A9?= Date: Thu, 15 Dec 2022 16:42:32 +0100 Subject: [PATCH 09/10] Remove ref to JOTM, inactive since 2009 --- framework-docs/src/docs/asciidoc/data-access.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework-docs/src/docs/asciidoc/data-access.adoc b/framework-docs/src/docs/asciidoc/data-access.adoc index b3255cf3f9f8..bc6fb8616639 100644 --- a/framework-docs/src/docs/asciidoc/data-access.adoc +++ b/framework-docs/src/docs/asciidoc/data-access.adoc @@ -129,7 +129,7 @@ Typically, you need an application server's JTA capability only if your applicat to handle transactions across multiple resources, which is not a requirement for many applications. Many high-end applications use a single, highly scalable database (such as Oracle RAC) instead. Stand-alone transaction managers (such as -https://www.atomikos.com/[Atomikos Transactions] and https://jotm.ow2.org/[JOTM]) +https://www.atomikos.com/[Atomikos Transactions]) are other options. Of course, you may need other application server capabilities, such as Java Message Service (JMS) and Jakarta EE Connector Architecture (JCA). From 84bab71a72b16d2139edc34512cb49bc82f330ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Basl=C3=A9?= Date: Fri, 16 Dec 2022 17:17:27 +0100 Subject: [PATCH 10/10] Revert mention of Jakarta Mail v1.x branch, just keep the fixed link --- framework-docs/src/docs/asciidoc/integration/email.adoc | 1 - 1 file changed, 1 deletion(-) diff --git a/framework-docs/src/docs/asciidoc/integration/email.adoc b/framework-docs/src/docs/asciidoc/integration/email.adoc index f00e078b25c5..bc08542b9104 100644 --- a/framework-docs/src/docs/asciidoc/integration/email.adoc +++ b/framework-docs/src/docs/asciidoc/integration/email.adoc @@ -13,7 +13,6 @@ the Spring Framework's email library: This library is freely available on the web -- for example, in Maven Central as `com.sun.mail:jakarta.mail`. Please make sure to use the latest 1.6.x version rather than Jakarta Mail 2.0 (which comes with a different package namespace). -See the `v1.x` code in the https://github.com/jakartaee/mail-api/tree/v1.x[Jakarta Mail-Api repository]. **** The Spring Framework provides a helpful utility library for sending email that shields