From 1d83df94e35d0439d869590a5eaf8da8ee48e703 Mon Sep 17 00:00:00 2001 From: Mengqi Xu <2663479778@qq.com> Date: Thu, 23 Jan 2025 01:24:52 +0800 Subject: [PATCH 1/2] Polish DataBinder. Use IllegalArgumentException instead of NumberFormatException. gh-34305. Signed-off-by: Mengqi Xu <2663479778@qq.com> --- .../springframework/validation/DataBinder.java | 9 ++++++++- .../ExtendedServletRequestDataBinderTests.java | 15 +++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/spring-context/src/main/java/org/springframework/validation/DataBinder.java b/spring-context/src/main/java/org/springframework/validation/DataBinder.java index 912dad1321dc..b44aba0e7f32 100644 --- a/spring-context/src/main/java/org/springframework/validation/DataBinder.java +++ b/spring-context/src/main/java/org/springframework/validation/DataBinder.java @@ -116,6 +116,7 @@ * @author Stephane Nicoll * @author Kazuki Shimizu * @author Sam Brannen + * @author Mengqi Xu * @see #setAllowedFields * @see #setRequiredFields * @see #registerCustomEditor @@ -1087,7 +1088,13 @@ private boolean hasValuesFor(String paramPath, ValueResolver resolver) { if (name.startsWith(paramPath + "[")) { int endIndex = name.indexOf(']', paramPath.length() + 1); String rawIndex = name.substring(paramPath.length() + 1, endIndex); - int index = Integer.parseInt(rawIndex); + int index; + try { + index = Integer.parseInt(rawIndex); + } + catch (NumberFormatException ex) { + throw new IllegalArgumentException("Failed to parse index from '" + rawIndex + "'", ex); + } indexes = (indexes != null ? indexes : new TreeSet<>()); indexes.add(index); } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinderTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinderTests.java index 02dc5656994f..b858c147a63c 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinderTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinderTests.java @@ -34,11 +34,13 @@ import org.springframework.web.testfixture.servlet.MockHttpServletRequest; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; /** * Test fixture for {@link ExtendedServletRequestDataBinder}. * * @author Rossen Stoyanchev + * @author Mengqi Xu */ class ExtendedServletRequestDataBinderTests { @@ -90,6 +92,19 @@ void createBinderViaConstructor() { assertThat(bean.someIntArray()).containsExactly(1, 2); } + @Test // gh-34205 + void createBinderViaConstructorWithInvalidIndex() { + request.addParameter("Some-Int-Array[foo]", "1"); + + ServletRequestDataBinder binder = new ExtendedServletRequestDataBinder(null); + binder.setTargetType(ResolvableType.forClass(DataBean.class)); + binder.setNameResolver(new BindParamNameResolver()); + + assertThatThrownBy(() -> binder.construct(request)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("Failed to parse index from 'foo'"); + } + @Test void uriVarsAndHeadersAddedConditionally() { request.addParameter("name", "John"); From 8e2339378f635aaf75d723cd7d45e97d0a47fb5d Mon Sep 17 00:00:00 2001 From: Mengqi Xu <2663479778@qq.com> Date: Thu, 23 Jan 2025 01:36:51 +0800 Subject: [PATCH 2/2] Add test case for can't find primary or single unique constructor // gh-34205 Signed-off-by: Mengqi Xu <2663479778@qq.com> --- .../ExtendedServletRequestDataBinderTests.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinderTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinderTests.java index b858c147a63c..d4036ad86c98 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinderTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinderTests.java @@ -105,6 +105,18 @@ void createBinderViaConstructorWithInvalidIndex() { .hasMessage("Failed to parse index from 'foo'"); } + @Test // gh-34205 + void createBinderViaConstructorWithChooseConstructor() { + request.addParameter("Some-Int-Array[0]", "1"); + + ServletRequestDataBinder binder = new ExtendedServletRequestDataBinder(null); + binder.setTargetType(ResolvableType.forClass(DataBean.class)); + binder.setNameResolver(new BindParamNameResolver()); + assertThatThrownBy(() -> binder.construct(request)) + .isInstanceOf(IllegalStateException.class) + .hasMessage("No primary or single unique constructor found for class java.lang.Integer"); + } + @Test void uriVarsAndHeadersAddedConditionally() { request.addParameter("name", "John");