Insert explicit ids for headers

This commit is contained in:
Rob Winch 2023-04-19 10:23:59 -05:00 committed by rstoyanchev
parent 3fe7c65218
commit 9ceb75b228
16 changed files with 58 additions and 2 deletions

View File

@ -1667,4 +1667,4 @@ its behavior changes.
| `spring.context.refresh` | `spring.context.refresh`
| Application context refresh phase. | Application context refresh phase.
| |
|=== |===

View File

@ -30,6 +30,7 @@ Spring application developers.
[[use-cases]]
== Use cases == Use cases
In addition to providing an explicit declaration for Spring Framework API nullability, In addition to providing an explicit declaration for Spring Framework API nullability,
@ -43,6 +44,7 @@ are available in the <<languages#kotlin-null-safety, Kotlin support documentatio
[[jsr-305-meta-annotations]]
== JSR-305 meta-annotations == JSR-305 meta-annotations
Spring annotations are meta-annotated with https://jcp.org/en/jsr/detail?id=305[JSR 305] Spring annotations are meta-annotated with https://jcp.org/en/jsr/detail?id=305[JSR 305]

View File

@ -1,4 +1,5 @@
:noheader: :noheader:
[[spring-framework-documentation]]
= Spring Framework Documentation = Spring Framework Documentation
include::attributes.adoc[] include::attributes.adoc[]

View File

@ -831,6 +831,7 @@ invoking the method again:
---- ----
[[enabling-jsr-107-support]]
=== Enabling JSR-107 Support === Enabling JSR-107 Support
You do not need to do anything specific to enable the JSR-107 support alongside Spring's You do not need to do anything specific to enable the JSR-107 support alongside Spring's

View File

@ -763,6 +763,7 @@ Here are some examples:
| `0 0 0 ? * MON#1` | the first Monday in the month at midnight | `0 0 0 ? * MON#1` | the first Monday in the month at midnight
|=== |===
[[macros]]
=== Macros === Macros
Expressions such as `0 0 * * * *` are hard for humans to parse and are, therefore, hard to fix in case of bugs. Expressions such as `0 0 * * * *` are hard for humans to parse and are, therefore, hard to fix in case of bugs.

View File

@ -296,6 +296,7 @@ for more details and up-to-date information. See also the experimental Kofu DSL
[[router-dsl]]
=== Router DSL === Router DSL
Spring Framework comes with a Kotlin router DSL available in 3 flavors: Spring Framework comes with a Kotlin router DSL available in 3 flavors:
@ -339,6 +340,7 @@ See https://github.com/mixitconf/mixit/[MiXiT project] for a concrete example.
[[mockmvc-dsl]]
=== MockMvc DSL === MockMvc DSL
A Kotlin DSL is provided via `MockMvc` Kotlin extensions in order to provide a more A Kotlin DSL is provided via `MockMvc` Kotlin extensions in order to provide a more
@ -366,6 +368,7 @@ mockMvc.get("/person/{name}", "Lee") {
[[kotlin-script-templates]]
=== Kotlin Script Templates === Kotlin Script Templates
Spring Framework provides a Spring Framework provides a
@ -413,6 +416,7 @@ project for more details.
[[kotlin-multiplatform-serialization]]
=== Kotlin multiplatform serialization === Kotlin multiplatform serialization
As of Spring Framework 5.3, https://github.com/Kotlin/kotlinx.serialization[Kotlin multiplatform serialization] is As of Spring Framework 5.3, https://github.com/Kotlin/kotlinx.serialization[Kotlin multiplatform serialization] is
@ -427,6 +431,7 @@ if Jackson is needed configure `KotlinSerializationJsonMessageConverter` manuall
[[coroutines]]
== Coroutines == Coroutines
Kotlin https://kotlinlang.org/docs/reference/coroutines-overview.html[Coroutines] are Kotlin Kotlin https://kotlinlang.org/docs/reference/coroutines-overview.html[Coroutines] are Kotlin
@ -447,6 +452,7 @@ Spring Framework provides support for Coroutines on the following scope:
[[dependencies]]
=== Dependencies === Dependencies
Coroutines support is enabled when `kotlinx-coroutines-core` and `kotlinx-coroutines-reactor` Coroutines support is enabled when `kotlinx-coroutines-core` and `kotlinx-coroutines-reactor`
@ -466,6 +472,7 @@ Version `1.4.0` and above are supported.
[[how-reactive-translates-to-coroutines?]]
=== How Reactive translates to Coroutines? === How Reactive translates to Coroutines?
For return values, the translation from Reactive to Coroutines APIs is the following: For return values, the translation from Reactive to Coroutines APIs is the following:
@ -494,6 +501,7 @@ for more details, including how to run code concurrently with Coroutines.
[[controllers]]
=== Controllers === Controllers
Here is an example of a Coroutines `@RestController`. Here is an example of a Coroutines `@RestController`.
@ -592,6 +600,7 @@ class CoroutinesViewController(banner: Banner) {
[[webflux-fn]]
=== WebFlux.fn === WebFlux.fn
Here is an example of Coroutines router defined via the {docs-spring-framework}/kdoc-api/spring-webflux/org.springframework.web.reactive.function.server/co-router.html[coRouter { }] DSL and related handlers. Here is an example of Coroutines router defined via the {docs-spring-framework}/kdoc-api/spring-webflux/org.springframework.web.reactive.function.server/co-router.html[coRouter { }] DSL and related handlers.
@ -627,6 +636,7 @@ class UserHandler(builder: WebClient.Builder) {
[[transactions]]
=== Transactions === Transactions
Transactions on Coroutines are supported via the programmatic variant of the Reactive Transactions on Coroutines are supported via the programmatic variant of the Reactive
@ -686,6 +696,7 @@ in Kotlin.
[[final-by-default]]
=== Final by Default === Final by Default
By default, https://discuss.kotlinlang.org/t/classes-final-by-default/166[all classes in Kotlin are `final`]. By default, https://discuss.kotlinlang.org/t/classes-final-by-default/166[all classes in Kotlin are `final`].
@ -727,6 +738,7 @@ using the `kotlin-allopen` plugin, since this is the most commonly used setup.
[[using-immutable-class-instances-for-persistence]]
=== Using Immutable Class Instances for Persistence === Using Immutable Class Instances for Persistence
In Kotlin, it is convenient and considered to be a best practice to declare read-only properties In Kotlin, it is convenient and considered to be a best practice to declare read-only properties
@ -772,6 +784,7 @@ does not require the `kotlin-noarg` plugin if the module uses Spring Data object
[[injecting-dependencies]]
=== Injecting Dependencies === Injecting Dependencies
Our recommendation is to try to favor constructor injection with `val` read-only (and Our recommendation is to try to favor constructor injection with `val` read-only (and
@ -809,6 +822,7 @@ as the following example shows:
[[injecting-configuration-properties]]
=== Injecting Configuration Properties === Injecting Configuration Properties
In Java, you can inject configuration properties by using annotations (such as pass:q[`@Value("${property}")`)]. In Java, you can inject configuration properties by using annotations (such as pass:q[`@Value("${property}")`)].
@ -850,6 +864,7 @@ that uses the `${...}` syntax, with configuration beans, as the following exampl
[[checked-exceptions]]
=== Checked Exceptions === Checked Exceptions
Java and https://kotlinlang.org/docs/reference/exceptions.html[Kotlin exception handling] Java and https://kotlinlang.org/docs/reference/exceptions.html[Kotlin exception handling]
@ -864,6 +879,7 @@ to specify explicitly the checked exceptions thrown (for example `@Throws(IOExce
[[annotation-array-attributes]]
=== Annotation Array Attributes === Annotation Array Attributes
Kotlin annotations are mostly similar to Java annotations, but array attributes (which are Kotlin annotations are mostly similar to Java annotations, but array attributes (which are
@ -910,6 +926,7 @@ be matched, not only the `GET` method.
[[testing]]
=== Testing === Testing
This section addresses testing with the combination of Kotlin and Spring Framework. This section addresses testing with the combination of Kotlin and Spring Framework.
@ -920,6 +937,7 @@ NOTE: If you are using Spring Boot, see
https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-kotlin-testing[this related documentation]. https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-kotlin-testing[this related documentation].
[[constructor-injection]]
==== Constructor injection ==== Constructor injection
As described in the <<testing#testcontext-junit-jupiter-di, dedicated section>>, As described in the <<testing#testcontext-junit-jupiter-di, dedicated section>>,
@ -942,6 +960,7 @@ class OrderServiceIntegrationTests(val orderService: OrderService,
==== ====
[[per_class-lifecycle]]
==== `PER_CLASS` Lifecycle ==== `PER_CLASS` Lifecycle
Kotlin lets you specify meaningful test function names between backticks (```). Kotlin lets you specify meaningful test function names between backticks (```).
@ -986,6 +1005,7 @@ class IntegrationTests {
---- ----
[[specification-like-tests]]
==== Specification-like Tests ==== Specification-like Tests
You can create specification-like tests with JUnit 5 and Kotlin. You can create specification-like tests with JUnit 5 and Kotlin.
@ -1036,6 +1056,7 @@ https://spring.io/guides/tutorials/spring-boot-kotlin/[the dedicated tutorial].
[[start-spring-io]]
=== `start.spring.io` === `start.spring.io`
The easiest way to start a new Spring Framework project in Kotlin is to create a new Spring The easiest way to start a new Spring Framework project in Kotlin is to create a new Spring
@ -1043,6 +1064,7 @@ Boot 2 project on https://start.spring.io/#!language=kotlin&type=gradle-project[
[[choosing-the-web-flavor]]
=== Choosing the Web Flavor === Choosing the Web Flavor
Spring Framework now comes with two different web stacks: <<web#mvc, Spring MVC>> and Spring Framework now comes with two different web stacks: <<web#mvc, Spring MVC>> and
@ -1073,6 +1095,7 @@ Kotlin and the Spring Framework:
[[examples]]
=== Examples === Examples
The following Github projects offer examples that you can learn from and possibly even extend: The following Github projects offer examples that you can learn from and possibly even extend:
@ -1087,6 +1110,7 @@ The following Github projects offer examples that you can learn from and possibl
[[issues]]
=== Issues === Issues
The following list categorizes the pending issues related to Spring and Kotlin support: The following list categorizes the pending issues related to Spring and Kotlin support:

View File

@ -1,4 +1,4 @@
:toc: left :toc: left
:toclevels: 4 :toclevels: 4
:tabsize: 4 :tabsize: 4
:docinfo1: :docinfo1:

View File

@ -38,6 +38,7 @@ test execution by providing dependency injection, managing transactions, and so
class. See the {api-spring-framework}/test/context/package-summary.html[javadoc] and the class. See the {api-spring-framework}/test/context/package-summary.html[javadoc] and the
Spring test suite for further information and examples of various implementations. Spring test suite for further information and examples of various implementations.
[[testcontext]]
=== `TestContext` === `TestContext`
`TestContext` encapsulates the context in which a test is run (agnostic of the `TestContext` encapsulates the context in which a test is run (agnostic of the
@ -45,6 +46,7 @@ actual testing framework in use) and provides context management and caching sup
the test instance for which it is responsible. The `TestContext` also delegates to a the test instance for which it is responsible. The `TestContext` also delegates to a
`SmartContextLoader` to load an `ApplicationContext` if requested. `SmartContextLoader` to load an `ApplicationContext` if requested.
[[testcontextmanager]]
=== `TestContextManager` === `TestContextManager`
`TestContextManager` is the main entry point into the Spring TestContext Framework and is `TestContextManager` is the main entry point into the Spring TestContext Framework and is
@ -59,11 +61,13 @@ responsible for managing a single `TestContext` and signaling events to each reg
* After any "`after`" or "`after each`" methods of a particular testing framework. * After any "`after`" or "`after each`" methods of a particular testing framework.
* After any "`after class`" or "`after all`" methods of a particular testing framework. * After any "`after class`" or "`after all`" methods of a particular testing framework.
[[testexecutionlistener]]
=== `TestExecutionListener` === `TestExecutionListener`
`TestExecutionListener` defines the API for reacting to test-execution events published by `TestExecutionListener` defines the API for reacting to test-execution events published by
the `TestContextManager` with which the listener is registered. See <<testcontext-tel-config>>. the `TestContextManager` with which the listener is registered. See <<testcontext-tel-config>>.
[[context-loaders]]
=== Context Loaders === Context Loaders
`ContextLoader` is a strategy interface for loading an `ApplicationContext` for an `ContextLoader` is a strategy interface for loading an `ApplicationContext` for an
@ -1732,6 +1736,7 @@ through the `getPropertySourceLocations()` and `getPropertySourceProperties()` m
`MergedContextConfiguration`. `MergedContextConfiguration`.
==== ====
[[declaring-test-property-sources]]
==== Declaring Test Property Sources ==== Declaring Test Property Sources
You can configure test properties files by using the `locations` or `value` attribute of You can configure test properties files by using the `locations` or `value` attribute of
@ -1829,6 +1834,7 @@ meta-annotation.
==== ====
[[default-properties-file-detection]]
==== Default Properties File Detection ==== Default Properties File Detection
If `@TestPropertySource` is declared as an empty annotation (that is, without explicit If `@TestPropertySource` is declared as an empty annotation (that is, without explicit
@ -1838,6 +1844,7 @@ if the annotated test class is `com.example.MyTest`, the corresponding default p
file is `classpath:com/example/MyTest.properties`. If the default cannot be detected, an file is `classpath:com/example/MyTest.properties`. If the default cannot be detected, an
`IllegalStateException` is thrown. `IllegalStateException` is thrown.
[[precedence]]
==== Precedence ==== Precedence
Test properties have higher precedence than those defined in the operating system's Test properties have higher precedence than those defined in the operating system's
@ -1881,6 +1888,7 @@ to specify properties both in a file and inline:
} }
---- ----
[[inheriting-and-overriding-test-property-sources]]
==== Inheriting and Overriding Test Property Sources ==== Inheriting and Overriding Test Property Sources
`@TestPropertySource` supports boolean `inheritLocations` and `inheritProperties` `@TestPropertySource` supports boolean `inheritLocations` and `inheritProperties`
@ -2062,6 +2070,7 @@ properties.
} }
---- ----
[[precedence]]
==== Precedence ==== Precedence
Dynamic properties have higher precedence than those loaded from `@TestPropertySource`, Dynamic properties have higher precedence than those loaded from `@TestPropertySource`,

View File

@ -1,4 +1,5 @@
[id={chapter}.web-uricomponents] [id={chapter}.web-uricomponents]
[[uricomponents]]
= UriComponents = UriComponents
[.small]#Spring MVC and Spring WebFlux# [.small]#Spring MVC and Spring WebFlux#
@ -102,6 +103,7 @@ You can shorten it further still with a full URI template, as the following exam
[id={chapter}.web-uribuilder] [id={chapter}.web-uribuilder]
[[uribuilder]]
= UriBuilder = UriBuilder
[.small]#Spring MVC and Spring WebFlux# [.small]#Spring MVC and Spring WebFlux#
@ -194,6 +196,7 @@ that holds configuration and preferences, as the following example shows:
[id={chapter}.web-uri-encoding] [id={chapter}.web-uri-encoding]
[[uri-encoding]]
= URI Encoding = URI Encoding
[.small]#Spring MVC and Spring WebFlux# [.small]#Spring MVC and Spring WebFlux#

View File

@ -619,6 +619,7 @@ RouterFunction<ServerResponse> route = route()
<4> `otherRoute` is a router function that is created elsewhere, and added to the route built. <4> `otherRoute` is a router function that is created elsewhere, and added to the route built.
[[nested-routes]]
=== Nested Routes === Nested Routes
It is common for a group of router functions to have a shared predicate, for instance a It is common for a group of router functions to have a shared predicate, for instance a

View File

@ -869,6 +869,7 @@ inline-style, through the built-in `BodyInserters`, as the following example sho
.awaitBody<Unit>() .awaitBody<Unit>()
---- ----
[[partevent]]
==== `PartEvent` ==== `PartEvent`
To stream multipart data sequentially, you can provide multipart content through `PartEvent` To stream multipart data sequentially, you can provide multipart content through `PartEvent`

View File

@ -1,5 +1,6 @@
[[webflux]] [[webflux]]
:chapter: webflux :chapter: webflux
[[spring-webflux]]
= Spring WebFlux = Spring WebFlux
The original web framework included in the Spring Framework, Spring Web MVC, was The original web framework included in the Spring Framework, Spring Web MVC, was
@ -248,6 +249,7 @@ current thread (and rely on callbacks instead) means that you do not need extra
there are no blocking calls to absorb. there are no blocking calls to absorb.
[[invoking-a-blocking-api]]
==== Invoking a Blocking API ==== Invoking a Blocking API
What if you do need to use a blocking library? Both Reactor and RxJava provide the What if you do need to use a blocking library? Both Reactor and RxJava provide the
@ -255,6 +257,7 @@ What if you do need to use a blocking library? Both Reactor and RxJava provide t
easy escape hatch. Keep in mind, however, that blocking APIs are not a good fit for easy escape hatch. Keep in mind, however, that blocking APIs are not a good fit for
this concurrency model. this concurrency model.
[[mutable-state]]
==== Mutable State ==== Mutable State
In Reactor and RxJava, you declare logic through operators. At runtime, a reactive In Reactor and RxJava, you declare logic through operators. At runtime, a reactive
@ -262,6 +265,7 @@ pipeline is formed where data is processed sequentially, in distinct stages. A k
of this is that it frees applications from having to protect mutable state because of this is that it frees applications from having to protect mutable state because
application code within that pipeline is never invoked concurrently. application code within that pipeline is never invoked concurrently.
[[threading-model]]
==== Threading Model ==== Threading Model
What threads should you expect to see on a server running with Spring WebFlux? What threads should you expect to see on a server running with Spring WebFlux?
@ -287,6 +291,7 @@ specific thread pool `Scheduler` strategy.
* Data access libraries and other third party dependencies can also create and use threads * Data access libraries and other third party dependencies can also create and use threads
of their own. of their own.
[[configuring]]
==== Configuring ==== Configuring
The Spring Framework does not provide support for starting and stopping The Spring Framework does not provide support for starting and stopping
@ -2841,6 +2846,7 @@ as the following example shows:
<1> Using `@RequestBody`. <1> Using `@RequestBody`.
-- --
[[partevent]]
===== `PartEvent` ===== `PartEvent`
To access multipart data sequentially, in a streaming fashion, you can use `@RequestBody` with To access multipart data sequentially, in a streaming fashion, you can use `@RequestBody` with

View File

@ -599,6 +599,7 @@ The following example shows the composition of four routes:
<4> `otherRoute` is a router function that is created elsewhere, and added to the route built. <4> `otherRoute` is a router function that is created elsewhere, and added to the route built.
[[nested-routes]]
=== Nested Routes === Nested Routes
It is common for a group of router functions to have a shared predicate, for instance a shared It is common for a group of router functions to have a shared predicate, for instance a shared

View File

@ -1,5 +1,6 @@
[[mvc]] [[mvc]]
:chapter: mvc :chapter: mvc
[[spring-web-mvc]]
= Spring Web MVC = Spring Web MVC
Spring Web MVC is the original web framework built on the Servlet API and has been included Spring Web MVC is the original web framework built on the Servlet API and has been included

View File

@ -1,4 +1,5 @@
[id={chapter}.websocket-intro] [id={chapter}.websocket-intro]
[[introduction-to-websocket]]
= Introduction to WebSocket = Introduction to WebSocket
The WebSocket protocol, https://tools.ietf.org/html/rfc6455[RFC 6455], provides a standardized The WebSocket protocol, https://tools.ietf.org/html/rfc6455[RFC 6455], provides a standardized
@ -55,6 +56,7 @@ instructions of the cloud provider related to WebSocket support.
[id={chapter}.websocket-intro-architecture] [id={chapter}.websocket-intro-architecture]
[[http-versus-websocket]]
== HTTP Versus WebSocket == HTTP Versus WebSocket
Even though WebSocket is designed to be HTTP-compatible and starts with an HTTP request, Even though WebSocket is designed to be HTTP-compatible and starts with an HTTP request,
@ -81,6 +83,7 @@ In the absence of that, they need to come up with their own conventions.
[id={chapter}.websocket-intro-when-to-use] [id={chapter}.websocket-intro-when-to-use]
[[when-to-use-websockets]]
== When to Use WebSockets == When to Use WebSockets
WebSockets can make a web page be dynamic and interactive. However, in many cases, WebSockets can make a web page be dynamic and interactive. However, in many cases,

View File

@ -1226,6 +1226,7 @@ referenced through `@DestinationVariable` method arguments. Applications can als
a dot-separated destination convention for mappings, as explained in a dot-separated destination convention for mappings, as explained in
<<websocket-stomp-destination-separator>>. <<websocket-stomp-destination-separator>>.
[[supported-method-arguments]]
===== Supported Method Arguments ===== Supported Method Arguments
The following table describes the method arguments: The following table describes the method arguments:
@ -1270,6 +1271,7 @@ Values are converted to the declared method argument type as necessary.
|=== |===
[[return-values]]
===== Return Values ===== Return Values
By default, the return value from a `@MessageMapping` method is serialized to a payload By default, the return value from a `@MessageMapping` method is serialized to a payload