From a47aed252afa40aacc1b709e18c0e3a1395c0a50 Mon Sep 17 00:00:00 2001 From: Yanming Zhou Date: Mon, 22 Jun 2026 17:43:17 +0800 Subject: [PATCH] Refactor NumberToDataSizeConverter to use `DataSize.ofBytes(long)` directly Prior to this commit, `Number` is converted to `String` and then using regular expressions to match/parse the string back into a suitable `long`, it was based on Spring Boot's string-based implementation which included support for `@DataSizeUnit`. Closes GH-36956 Signed-off-by: Yanming Zhou --- .../core/convert/support/NumberToDataSizeConverter.java | 9 +++++++-- .../convert/converter/DefaultConversionServiceTests.java | 6 ++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/spring-core/src/main/java/org/springframework/core/convert/support/NumberToDataSizeConverter.java b/spring-core/src/main/java/org/springframework/core/convert/support/NumberToDataSizeConverter.java index a0a6145efdef..0231b64f1a06 100644 --- a/spring-core/src/main/java/org/springframework/core/convert/support/NumberToDataSizeConverter.java +++ b/spring-core/src/main/java/org/springframework/core/convert/support/NumberToDataSizeConverter.java @@ -23,15 +23,20 @@ * Converts from a {@link Number} to a {@link DataSize}. * * @author YeongJae Min + * @author Yanming Zhou * @since 7.1 - * @see DataSize#parse(CharSequence) + * @see DataSize#ofBytes(long) * @see StringToDataSizeConverter */ final class NumberToDataSizeConverter implements Converter { @Override public DataSize convert(Number source) { - return DataSize.parse(source.toString()); + long bytes = source.longValue(); + if (source.doubleValue() - bytes != 0) { + throw new IllegalArgumentException("'" + source + "' is not a valid data size"); + } + return DataSize.ofBytes(bytes); } } diff --git a/spring-core/src/test/java/org/springframework/core/convert/converter/DefaultConversionServiceTests.java b/spring-core/src/test/java/org/springframework/core/convert/converter/DefaultConversionServiceTests.java index 51202425e413..b6378d187d76 100644 --- a/spring-core/src/test/java/org/springframework/core/convert/converter/DefaultConversionServiceTests.java +++ b/spring-core/src/test/java/org/springframework/core/convert/converter/DefaultConversionServiceTests.java @@ -76,6 +76,8 @@ * @author Juergen Hoeller * @author Stephane Nicoll * @author Sam Brannen + * @author YeongJae Min + * @author Yanming Zhou */ class DefaultConversionServiceTests { @@ -258,12 +260,16 @@ void stringToDataSize() { void numberToDataSizeWithDecimalNumber() { assertThatExceptionOfType(ConversionFailedException.class) .isThrownBy(() -> conversionService.convert(10.5, DataSize.class)); + assertThatExceptionOfType(ConversionFailedException.class) + .isThrownBy(() -> conversionService.convert(new BigDecimal("10.5"), DataSize.class)); } @Test // gh-36830 void numberToDataSize() { assertThat(conversionService.convert(10, DataSize.class)).isEqualTo(DataSize.ofBytes(10)); assertThat(conversionService.convert(-10L, DataSize.class)).isEqualTo(DataSize.ofBytes(-10)); + assertThat(conversionService.convert(new BigDecimal("10"), DataSize.class)).isEqualTo(DataSize.ofBytes(10)); + assertThat(conversionService.convert(new BigDecimal("10.0"), DataSize.class)).isEqualTo(DataSize.ofBytes(10)); } @Test