From c5044bfdbc073360b1bc6e7c1270a08180a913bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deleuze?= Date: Wed, 7 Jan 2026 12:32:48 +0100 Subject: [PATCH] Refine multipart-forms.adoc See gh-36094 --- .../controller/ann-methods/multipart-forms.adoc | 8 ++++---- .../annmethods/partevent/PartEventController.java | 13 ++++++------- .../annmethods/partevent/PartEventController.kt | 12 ++++++------ 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/framework-docs/modules/ROOT/pages/web/webflux/controller/ann-methods/multipart-forms.adoc b/framework-docs/modules/ROOT/pages/web/webflux/controller/ann-methods/multipart-forms.adoc index 9b6b76fa7e2..c886714b8e0 100644 --- a/framework-docs/modules/ROOT/pages/web/webflux/controller/ann-methods/multipart-forms.adoc +++ b/framework-docs/modules/ROOT/pages/web/webflux/controller/ann-methods/multipart-forms.adoc @@ -41,8 +41,8 @@ Kotlin:: [source,kotlin,indent=0,subs="verbatim,quotes"] ---- class MyForm( - val name: String, - val file: FilePart) + private val name: String, + private val file: FilePart) @Controller class FileUploadController { @@ -104,7 +104,7 @@ Kotlin:: ---- @PostMapping("/") fun handle(@RequestPart("meta-data") metadata: Part, // <1> - @RequestPart("file-data") file: FilePart): String { // <2> + @RequestPart("file-data") file: FilePart): String { // <2> // ... } ---- @@ -170,7 +170,7 @@ Kotlin:: ---- @PostMapping("/") fun handle(@Valid @RequestPart("meta-data") metadata: Mono): String { - // ... + // use one of the onError* operators... } ---- ====== diff --git a/framework-docs/src/main/java/org/springframework/docs/web/webflux/controller/annmethods/partevent/PartEventController.java b/framework-docs/src/main/java/org/springframework/docs/web/webflux/controller/annmethods/partevent/PartEventController.java index 8d11a49dc31..714e0f71970 100644 --- a/framework-docs/src/main/java/org/springframework/docs/web/webflux/controller/annmethods/partevent/PartEventController.java +++ b/framework-docs/src/main/java/org/springframework/docs/web/webflux/controller/annmethods/partevent/PartEventController.java @@ -31,29 +31,28 @@ public class PartEventController { // tag::snippet[] @PostMapping("/") - public void handle(@RequestBody Flux allPartsEvents) { // Using @RequestBody. + public void handle(@RequestBody Flux allPartEvents) { // The final PartEvent for a particular part will have isLast() set to true, and can be // followed by additional events belonging to subsequent parts. // This makes the isLast property suitable as a predicate for the Flux::windowUntil operator, to // split events from all parts into windows that each belong to a single part. - allPartsEvents.windowUntil(PartEvent::isLast) - + allPartEvents.windowUntil(PartEvent::isLast) // The Flux::switchOnFirst operator allows you to see whether you are handling - // a form field or file upload. + // a form field or file upload .concatMap(p -> p.switchOnFirst((signal, partEvents) -> { if (signal.hasValue()) { PartEvent event = signal.get(); if (event instanceof FormPartEvent formEvent) { String value = formEvent.value(); - // Handling the form field. + // Handling of the form field } else if (event instanceof FilePartEvent fileEvent) { String filename = fileEvent.filename(); - // The body contents must be completely consumed, relayed, or released to avoid memory leaks. + // The body contents must be completely consumed, relayed, or released to avoid memory leaks Flux contents = partEvents.map(PartEvent::content); - // Handling the file upload. + // Handling of the file upload } else { return Mono.error(new RuntimeException("Unexpected event: " + event)); diff --git a/framework-docs/src/main/kotlin/org/springframework/docs/web/webflux/controller/annmethods/partevent/PartEventController.kt b/framework-docs/src/main/kotlin/org/springframework/docs/web/webflux/controller/annmethods/partevent/PartEventController.kt index 0a79bf860f6..deed535d977 100644 --- a/framework-docs/src/main/kotlin/org/springframework/docs/web/webflux/controller/annmethods/partevent/PartEventController.kt +++ b/framework-docs/src/main/kotlin/org/springframework/docs/web/webflux/controller/annmethods/partevent/PartEventController.kt @@ -31,29 +31,29 @@ class PartEventController { // tag::snippet[] @PostMapping("/") - fun handle(@RequestBody allPartsEvents: Flux) { // Using @RequestBody. + fun handle(@RequestBody allPartEvents: Flux) { // The final PartEvent for a particular part will have isLast() set to true, and can be // followed by additional events belonging to subsequent parts. // This makes the isLast property suitable as a predicate for the Flux::windowUntil operator, to // split events from all parts into windows that each belong to a single part. - allPartsEvents.windowUntil(PartEvent::isLast) + allPartEvents.windowUntil(PartEvent::isLast) .concatMap { // The Flux::switchOnFirst operator allows you to see whether you are handling - // a form field or file upload. + // a form field or file upload it.switchOnFirst { signal, partEvents -> if (signal.hasValue()) { val event = signal.get() if (event is FormPartEvent) { val value: String = event.value() - // Handling the form field. + // Handling of the form field } else if (event is FilePartEvent) { val filename: String = event.filename() - // The body contents must be completely consumed, relayed, or released to avoid memory leaks. + // The body contents must be completely consumed, relayed, or released to avoid memory leaks val contents: Flux = partEvents.map(PartEvent::content) - // Handling the file upload. + // Handling of the file upload } else { return@switchOnFirst Mono.error(RuntimeException("Unexpected event: $event")) }