diff --git a/spring-beans/src/main/java/org/springframework/beans/propertyeditors/CharsetEditor.java b/spring-beans/src/main/java/org/springframework/beans/propertyeditors/CharsetEditor.java
index adcb806e684..ef772db749c 100644
--- a/spring-beans/src/main/java/org/springframework/beans/propertyeditors/CharsetEditor.java
+++ b/spring-beans/src/main/java/org/springframework/beans/propertyeditors/CharsetEditor.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2012 the original author or authors.
+ * Copyright 2002-2022 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -29,6 +29,7 @@ import org.springframework.util.StringUtils;
* e.g. {@code UTF-8}, {@code ISO-8859-16}, etc.
*
* @author Arjen Poutsma
+ * @author Sam Brannen
* @since 2.5.4
* @see Charset
*/
@@ -37,7 +38,7 @@ public class CharsetEditor extends PropertyEditorSupport {
@Override
public void setAsText(String text) throws IllegalArgumentException {
if (StringUtils.hasText(text)) {
- setValue(Charset.forName(text));
+ setValue(Charset.forName(text.trim()));
}
else {
setValue(null);
diff --git a/spring-beans/src/main/java/org/springframework/beans/propertyeditors/CurrencyEditor.java b/spring-beans/src/main/java/org/springframework/beans/propertyeditors/CurrencyEditor.java
index 0d044ffe11a..b6b9d318afe 100644
--- a/spring-beans/src/main/java/org/springframework/beans/propertyeditors/CurrencyEditor.java
+++ b/spring-beans/src/main/java/org/springframework/beans/propertyeditors/CurrencyEditor.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2012 the original author or authors.
+ * Copyright 2002-2022 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,11 +19,14 @@ package org.springframework.beans.propertyeditors;
import java.beans.PropertyEditorSupport;
import java.util.Currency;
+import org.springframework.util.StringUtils;
+
/**
* Editor for {@code java.util.Currency}, translating currency codes into Currency
* objects. Exposes the currency code as text representation of a Currency object.
*
* @author Juergen Hoeller
+ * @author Sam Brannen
* @since 3.0
* @see java.util.Currency
*/
@@ -31,6 +34,9 @@ public class CurrencyEditor extends PropertyEditorSupport {
@Override
public void setAsText(String text) throws IllegalArgumentException {
+ if (StringUtils.hasText(text)) {
+ text = text.trim();
+ }
setValue(Currency.getInstance(text));
}
diff --git a/spring-beans/src/main/java/org/springframework/beans/propertyeditors/TimeZoneEditor.java b/spring-beans/src/main/java/org/springframework/beans/propertyeditors/TimeZoneEditor.java
index 6b809169b96..3833c026812 100644
--- a/spring-beans/src/main/java/org/springframework/beans/propertyeditors/TimeZoneEditor.java
+++ b/spring-beans/src/main/java/org/springframework/beans/propertyeditors/TimeZoneEditor.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2013 the original author or authors.
+ * Copyright 2002-2022 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -28,6 +28,7 @@ import org.springframework.util.StringUtils;
*
* @author Juergen Hoeller
* @author Nicholas Williams
+ * @author Sam Brannen
* @since 3.0
* @see java.util.TimeZone
* @see ZoneIdEditor
@@ -36,6 +37,9 @@ public class TimeZoneEditor extends PropertyEditorSupport {
@Override
public void setAsText(String text) throws IllegalArgumentException {
+ if (StringUtils.hasText(text)) {
+ text = text.trim();
+ }
setValue(StringUtils.parseTimeZoneString(text));
}
diff --git a/spring-beans/src/main/java/org/springframework/beans/propertyeditors/ZoneIdEditor.java b/spring-beans/src/main/java/org/springframework/beans/propertyeditors/ZoneIdEditor.java
index 912bdd5fb74..4992e33aebd 100644
--- a/spring-beans/src/main/java/org/springframework/beans/propertyeditors/ZoneIdEditor.java
+++ b/spring-beans/src/main/java/org/springframework/beans/propertyeditors/ZoneIdEditor.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2016 the original author or authors.
+ * Copyright 2002-2022 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,11 +19,14 @@ package org.springframework.beans.propertyeditors;
import java.beans.PropertyEditorSupport;
import java.time.ZoneId;
+import org.springframework.util.StringUtils;
+
/**
* Editor for {@code java.time.ZoneId}, translating zone ID Strings into {@code ZoneId}
* objects. Exposes the {@code TimeZone} ID as a text representation.
*
* @author Nicholas Williams
+ * @author Sam Brannen
* @since 4.0
* @see java.time.ZoneId
* @see TimeZoneEditor
@@ -32,6 +35,9 @@ public class ZoneIdEditor extends PropertyEditorSupport {
@Override
public void setAsText(String text) throws IllegalArgumentException {
+ if (StringUtils.hasText(text)) {
+ text = text.trim();
+ }
setValue(ZoneId.of(text));
}
diff --git a/spring-beans/src/test/java/org/springframework/beans/propertyeditors/ZoneIdEditorTests.java b/spring-beans/src/test/java/org/springframework/beans/propertyeditors/ZoneIdEditorTests.java
index 7a9162314b2..b62f952fdb1 100644
--- a/spring-beans/src/test/java/org/springframework/beans/propertyeditors/ZoneIdEditorTests.java
+++ b/spring-beans/src/test/java/org/springframework/beans/propertyeditors/ZoneIdEditorTests.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2019 the original author or authors.
+ * Copyright 2002-2022 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,19 +19,26 @@ package org.springframework.beans.propertyeditors;
import java.time.ZoneId;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
import static org.assertj.core.api.Assertions.assertThat;
/**
* @author Nicholas Williams
+ * @author Sam Brannen
*/
-public class ZoneIdEditorTests {
+class ZoneIdEditorTests {
private final ZoneIdEditor editor = new ZoneIdEditor();
- @Test
- public void americaChicago() {
- editor.setAsText("America/Chicago");
+ @ParameterizedTest(name = "[{index}] text = ''{0}''")
+ @ValueSource(strings = {
+ "America/Chicago",
+ " America/Chicago ",
+ })
+ void americaChicago(String text) {
+ editor.setAsText(text);
ZoneId zoneId = (ZoneId) editor.getValue();
assertThat(zoneId).as("The zone ID should not be null.").isNotNull();
@@ -41,7 +48,7 @@ public class ZoneIdEditorTests {
}
@Test
- public void americaLosAngeles() {
+ void americaLosAngeles() {
editor.setAsText("America/Los_Angeles");
ZoneId zoneId = (ZoneId) editor.getValue();
@@ -52,12 +59,12 @@ public class ZoneIdEditorTests {
}
@Test
- public void getNullAsText() {
+ void getNullAsText() {
assertThat(editor.getAsText()).as("The returned value is not correct.").isEqualTo("");
}
@Test
- public void getValueAsText() {
+ void getValueAsText() {
editor.setValue(ZoneId.of("America/New_York"));
assertThat(editor.getAsText()).as("The text version is not correct.").isEqualTo("America/New_York");
}
diff --git a/spring-core/src/main/java/org/springframework/util/StringUtils.java b/spring-core/src/main/java/org/springframework/util/StringUtils.java
index c2d60ef7147..33a8249fc6a 100644
--- a/spring-core/src/main/java/org/springframework/util/StringUtils.java
+++ b/spring-core/src/main/java/org/springframework/util/StringUtils.java
@@ -232,21 +232,23 @@ public abstract class StringUtils {
}
/**
- * Trim all whitespace from the given {@code String}:
+ * Trim all whitespace from the given {@code CharSequence}:
* leading, trailing, and in between characters.
- * @param str the {@code String} to check
- * @return the trimmed {@code String}
+ * @param text the {@code CharSequence} to check
+ * @return the trimmed {@code CharSequence}
+ * @since 5.3.22
+ * @see #trimAllWhitespace(String)
* @see java.lang.Character#isWhitespace
*/
- public static String trimAllWhitespace(String str) {
- if (!hasLength(str)) {
- return str;
+ public static CharSequence trimAllWhitespace(CharSequence text) {
+ if (!hasLength(text)) {
+ return text;
}
- int len = str.length();
- StringBuilder sb = new StringBuilder(str.length());
+ int len = text.length();
+ StringBuilder sb = new StringBuilder(text.length());
for (int i = 0; i < len; i++) {
- char c = str.charAt(i);
+ char c = text.charAt(i);
if (!Character.isWhitespace(c)) {
sb.append(c);
}
@@ -254,6 +256,21 @@ public abstract class StringUtils {
return sb.toString();
}
+ /**
+ * Trim all whitespace from the given {@code String}:
+ * leading, trailing, and in between characters.
+ * @param str the {@code String} to check
+ * @return the trimmed {@code String}
+ * @see #trimAllWhitespace(CharSequence)
+ * @see java.lang.Character#isWhitespace
+ */
+ public static String trimAllWhitespace(String str) {
+ if (str == null) {
+ return null;
+ }
+ return trimAllWhitespace((CharSequence) str).toString();
+ }
+
/**
* Trim leading whitespace from the given {@code String}.
* @param str the {@code String} to check
diff --git a/spring-core/src/main/java/org/springframework/util/unit/DataSize.java b/spring-core/src/main/java/org/springframework/util/unit/DataSize.java
index 75183a18e05..bc57d140dd9 100644
--- a/spring-core/src/main/java/org/springframework/util/unit/DataSize.java
+++ b/spring-core/src/main/java/org/springframework/util/unit/DataSize.java
@@ -174,7 +174,7 @@ public final class DataSize implements Comparable, Serializable {
public static DataSize parse(CharSequence text, @Nullable DataUnit defaultUnit) {
Assert.notNull(text, "Text must not be null");
try {
- Matcher matcher = DataSizeUtils.PATTERN.matcher(text);
+ Matcher matcher = DataSizeUtils.PATTERN.matcher(StringUtils.trimAllWhitespace(text));
Assert.state(matcher.matches(), "Does not match data size pattern");
DataUnit unit = DataSizeUtils.determineDataUnit(matcher.group(2), defaultUnit);
long amount = Long.parseLong(matcher.group(1));
diff --git a/spring-core/src/test/java/org/springframework/util/unit/DataSizeTests.java b/spring-core/src/test/java/org/springframework/util/unit/DataSizeTests.java
index 74e830c5f66..2224ce83087 100644
--- a/spring-core/src/test/java/org/springframework/util/unit/DataSizeTests.java
+++ b/spring-core/src/test/java/org/springframework/util/unit/DataSizeTests.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2019 the original author or authors.
+ * Copyright 2002-2022 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,6 +17,8 @@
package org.springframework.util.unit;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
@@ -25,6 +27,7 @@ import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException
* Tests for {@link DataSize}.
*
* @author Stephane Nicoll
+ * @author Sam Brannen
*/
class DataSizeTests {
@@ -128,9 +131,17 @@ class DataSizeTests {
assertThat(DataSize.parse("-1", DataUnit.KILOBYTES)).isEqualTo(DataSize.ofKilobytes(-1));
}
- @Test
- void parseWithBytes() {
- assertThat(DataSize.parse("1024B")).isEqualTo(DataSize.ofKilobytes(1));
+ @ParameterizedTest(name = "[{index}] text = ''{0}''")
+ @ValueSource(strings = {
+ "1024B",
+ "1024 B",
+ "1024B ",
+ " 1024B",
+ " 1024B ",
+ "\t1024 B\t"
+ })
+ void parseWithBytes(CharSequence text) {
+ assertThat(DataSize.parse(text)).isEqualTo(DataSize.ofKilobytes(1));
}
@Test
@@ -210,9 +221,12 @@ class DataSizeTests {
@Test
void parseWithUnsupportedUnit() {
- assertThatIllegalArgumentException().isThrownBy(() ->
- DataSize.parse("3WB"))
+ assertThatIllegalArgumentException()
+ .isThrownBy(() -> DataSize.parse("3WB"))
.withMessage("'3WB' is not a valid data size");
+ assertThatIllegalArgumentException()
+ .isThrownBy(() -> DataSize.parse("3 WB"))
+ .withMessage("'3 WB' is not a valid data size");
}
}