Skip to content

Commit 1d83df9

Browse files
committed
Polish DataBinder.
Use IllegalArgumentException instead of NumberFormatException. spring-projectsgh-34305. Signed-off-by: Mengqi Xu <[email protected]>
1 parent b3e8882 commit 1d83df9

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

spring-context/src/main/java/org/springframework/validation/DataBinder.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@
116116
* @author Stephane Nicoll
117117
* @author Kazuki Shimizu
118118
* @author Sam Brannen
119+
* @author Mengqi Xu
119120
* @see #setAllowedFields
120121
* @see #setRequiredFields
121122
* @see #registerCustomEditor
@@ -1087,7 +1088,13 @@ private boolean hasValuesFor(String paramPath, ValueResolver resolver) {
10871088
if (name.startsWith(paramPath + "[")) {
10881089
int endIndex = name.indexOf(']', paramPath.length() + 1);
10891090
String rawIndex = name.substring(paramPath.length() + 1, endIndex);
1090-
int index = Integer.parseInt(rawIndex);
1091+
int index;
1092+
try {
1093+
index = Integer.parseInt(rawIndex);
1094+
}
1095+
catch (NumberFormatException ex) {
1096+
throw new IllegalArgumentException("Failed to parse index from '" + rawIndex + "'", ex);
1097+
}
10911098
indexes = (indexes != null ? indexes : new TreeSet<>());
10921099
indexes.add(index);
10931100
}

spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinderTests.java

+15
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,13 @@
3434
import org.springframework.web.testfixture.servlet.MockHttpServletRequest;
3535

3636
import static org.assertj.core.api.Assertions.assertThat;
37+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
3738

3839
/**
3940
* Test fixture for {@link ExtendedServletRequestDataBinder}.
4041
*
4142
* @author Rossen Stoyanchev
43+
* @author Mengqi Xu
4244
*/
4345
class ExtendedServletRequestDataBinderTests {
4446

@@ -90,6 +92,19 @@ void createBinderViaConstructor() {
9092
assertThat(bean.someIntArray()).containsExactly(1, 2);
9193
}
9294

95+
@Test // gh-34205
96+
void createBinderViaConstructorWithInvalidIndex() {
97+
request.addParameter("Some-Int-Array[foo]", "1");
98+
99+
ServletRequestDataBinder binder = new ExtendedServletRequestDataBinder(null);
100+
binder.setTargetType(ResolvableType.forClass(DataBean.class));
101+
binder.setNameResolver(new BindParamNameResolver());
102+
103+
assertThatThrownBy(() -> binder.construct(request))
104+
.isInstanceOf(IllegalArgumentException.class)
105+
.hasMessage("Failed to parse index from 'foo'");
106+
}
107+
93108
@Test
94109
void uriVarsAndHeadersAddedConditionally() {
95110
request.addParameter("name", "John");

0 commit comments

Comments
 (0)