Consistent data class constructor resolution with clear error message

MVC data class processor constructs target instance even in case of binding failure, as long as the corresponding method parameter is not marked as optional.

Closes gh-24372
This commit is contained in:
Juergen Hoeller
2020-09-01 19:10:32 +02:00
parent 278c6d5cdb
commit e20bff9c64
5 changed files with 93 additions and 49 deletions

View File

@@ -2060,6 +2060,31 @@ public class ServletAnnotationControllerHandlerMethodTests extends AbstractServl
assertThat(response.getContentAsString()).isEqualTo("2:null-x-null");
}
@PathPatternsParameterizedTest
void dataClassBindingWithNullable(boolean usePathPatterns) throws Exception {
initDispatcherServlet(NullableDataClassController.class, usePathPatterns);
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/bind");
request.addParameter("param1", "value1");
request.addParameter("param2", "true");
request.addParameter("param3", "3");
MockHttpServletResponse response = new MockHttpServletResponse();
getServlet().service(request, response);
assertThat(response.getContentAsString()).isEqualTo("value1-true-3");
}
@PathPatternsParameterizedTest
void dataClassBindingWithNullableAndConversionError(boolean usePathPatterns) throws Exception {
initDispatcherServlet(NullableDataClassController.class, usePathPatterns);
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/bind");
request.addParameter("param1", "value1");
request.addParameter("param2", "x");
MockHttpServletResponse response = new MockHttpServletResponse();
getServlet().service(request, response);
assertThat(response.getContentAsString()).isEqualTo("value1-x-null");
}
@PathPatternsParameterizedTest
void dataClassBindingWithOptional(boolean usePathPatterns) throws Exception {
initDispatcherServlet(OptionalDataClassController.class, usePathPatterns);
@@ -3895,6 +3920,7 @@ public class ServletAnnotationControllerHandlerMethodTests extends AbstractServl
@RequestMapping("/bind")
public BindStatusView handle(@Valid DataClass data, BindingResult result) {
assertThat(data).isNotNull();
if (result.hasErrors()) {
return new BindStatusView(result.getErrorCount() + ":" + result.getFieldValue("param1") + "-" +
result.getFieldValue("param2") + "-" + result.getFieldValue("param3"));
@@ -3987,6 +4013,21 @@ public class ServletAnnotationControllerHandlerMethodTests extends AbstractServl
}
}
@RestController
public static class NullableDataClassController {
@RequestMapping("/bind")
public String handle(@Nullable DataClass data, BindingResult result) {
if (result.hasErrors()) {
assertThat(data).isNull();
return result.getFieldValue("param1") + "-" + result.getFieldValue("param2") + "-" +
result.getFieldValue("param3");
}
assertThat(data).isNotNull();
return data.param1 + "-" + data.param2 + "-" + data.param3;
}
}
@RestController
public static class OptionalDataClassController {