From ba5066f832c4854d144ccf6c42bdf91bbf66e3ae Mon Sep 17 00:00:00 2001 From: Stefan Reuter Date: Tue, 3 Feb 2026 14:18:17 +0100 Subject: [PATCH 1/2] Fix whitespace handling in multi-line javadoc Update spring-boot-configuration-processor to deal with multi-line javadoc comments that do not include their own whitespace after the new line. See gh-49039 Signed-off-by: Stefan Reuter --- .../boot/configurationprocessor/TypeUtils.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/TypeUtils.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/TypeUtils.java index 9154d5a76b8..bc133220093 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/TypeUtils.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/TypeUtils.java @@ -272,8 +272,11 @@ class TypeUtils { char lastChar = '.'; for (int i = 0; i < javadoc.length(); i++) { char ch = javadoc.charAt(i); + if (ch == '\r' || ch == '\n') { + ch = ' '; + } boolean repeatedSpace = ch == ' ' && lastChar == ' '; - if (ch != '\r' && ch != '\n' && !repeatedSpace) { + if (!repeatedSpace) { result.append(ch); lastChar = ch; } From 998a0f1b82bf21d6896da157f5619a1360339893 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Wed, 4 Feb 2026 16:21:03 -0800 Subject: [PATCH 2/2] Polish 'Fix whitespace handling in multi-line javadoc' See gh-49039 --- .../boot/configurationprocessor/TypeUtils.java | 6 ++---- ...gurationMetadataAnnotationProcessorTests.java | 3 +++ .../simple/DescriptionProperties.java | 16 ++++++++++++++++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/TypeUtils.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/TypeUtils.java index bc133220093..5a118de80cc 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/TypeUtils.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/TypeUtils.java @@ -272,10 +272,8 @@ class TypeUtils { char lastChar = '.'; for (int i = 0; i < javadoc.length(); i++) { char ch = javadoc.charAt(i); - if (ch == '\r' || ch == '\n') { - ch = ' '; - } - boolean repeatedSpace = ch == ' ' && lastChar == ' '; + ch = (ch == '\r' || ch == '\n') ? ' ' : ch; + boolean repeatedSpace = (ch == ' ' && lastChar == ' '); if (!repeatedSpace) { result.append(ch); lastChar = ch; diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationprocessor/ConfigurationMetadataAnnotationProcessorTests.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationprocessor/ConfigurationMetadataAnnotationProcessorTests.java index 19876043f45..9add8959618 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationprocessor/ConfigurationMetadataAnnotationProcessorTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationprocessor/ConfigurationMetadataAnnotationProcessorTests.java @@ -199,6 +199,9 @@ class ConfigurationMetadataAnnotationProcessorTests extends AbstractMetadataGene .fromSource(DescriptionProperties.class) .withDescription( "This is a lengthy description that spans across multiple lines to showcase that the line separators are cleaned automatically.")); + assertThat(metadata).has(Metadata.withProperty("description.multi-line-whitespace", String.class) + .fromSource(DescriptionProperties.class) + .withDescription("This is an example of a description with unusual whitespace after a new line.")); } @Test diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/simple/DescriptionProperties.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/simple/DescriptionProperties.java index e211792c77a..4ed2bdaedfc 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/simple/DescriptionProperties.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/simple/DescriptionProperties.java @@ -37,6 +37,14 @@ public class DescriptionProperties { */ private String multiLine; + // @formatter:off + /** + * This is an example of a description + *with unusual whitespace after a new line. + */ + private String multiLineWhitespace; + // @formatter:on + public String getSimple() { return this.simple; } @@ -53,4 +61,12 @@ public class DescriptionProperties { this.multiLine = multiLine; } + public String getMultiLineWhitespace() { + return this.multiLineWhitespace; + } + + public void setMultiLineWhitespace(String multiLineWhitespace) { + this.multiLineWhitespace = multiLineWhitespace; + } + }