diff --git a/spring-web/src/main/java/org/springframework/web/method/annotation/ModelAttributeMethodProcessor.java b/spring-web/src/main/java/org/springframework/web/method/annotation/ModelAttributeMethodProcessor.java index 8848067c7e77..df8b4fb82ca7 100644 --- a/spring-web/src/main/java/org/springframework/web/method/annotation/ModelAttributeMethodProcessor.java +++ b/spring-web/src/main/java/org/springframework/web/method/annotation/ModelAttributeMethodProcessor.java @@ -174,7 +174,7 @@ public final Object resolveArgument(MethodParameter parameter, @Nullable ModelAn } validateIfApplicable(binder, parameter); if (binder.getBindingResult().hasErrors() && isBindExceptionRequired(binder, parameter)) { - throw new BindException(binder.getBindingResult()); + throw new MethodArgumentNotValidException(parameter, binder.getBindingResult()); } } // Value type adaptation, also covering java.util.Optional diff --git a/spring-web/src/test/java/org/springframework/web/method/annotation/ModelAttributeMethodProcessorTests.java b/spring-web/src/test/java/org/springframework/web/method/annotation/ModelAttributeMethodProcessorTests.java index 4b7d56562850..9742c1c0cf37 100644 --- a/spring-web/src/test/java/org/springframework/web/method/annotation/ModelAttributeMethodProcessorTests.java +++ b/spring-web/src/test/java/org/springframework/web/method/annotation/ModelAttributeMethodProcessorTests.java @@ -28,9 +28,9 @@ import org.springframework.core.MethodParameter; import org.springframework.core.annotation.SynthesizingMethodParameter; import org.springframework.format.support.DefaultFormattingConversionService; -import org.springframework.validation.BindException; import org.springframework.validation.BindingResult; import org.springframework.validation.Errors; +import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.SessionAttributes; @@ -109,7 +109,7 @@ public void setup() throws Exception { @Test - public void supportedParameters() throws Exception { + public void supportedParameters() { assertThat(this.processor.supportsParameter(this.paramNamedValidModelAttr)).isTrue(); assertThat(this.processor.supportsParameter(this.paramModelAttr)).isTrue(); @@ -119,8 +119,8 @@ public void supportedParameters() throws Exception { } @Test - public void supportedParametersInDefaultResolutionMode() throws Exception { - processor = new ModelAttributeMethodProcessor(true); + public void supportedParametersInDefaultResolutionMode() { + this.processor = new ModelAttributeMethodProcessor(true); // Only non-simple types, even if not annotated assertThat(this.processor.supportsParameter(this.paramNamedValidModelAttr)).isTrue(); @@ -132,21 +132,21 @@ public void supportedParametersInDefaultResolutionMode() throws Exception { } @Test - public void supportedReturnTypes() throws Exception { - processor = new ModelAttributeMethodProcessor(false); + public void supportedReturnTypes() { + this.processor = new ModelAttributeMethodProcessor(false); assertThat(this.processor.supportsReturnType(returnParamNamedModelAttr)).isTrue(); assertThat(this.processor.supportsReturnType(returnParamNonSimpleType)).isFalse(); } @Test - public void supportedReturnTypesInDefaultResolutionMode() throws Exception { - processor = new ModelAttributeMethodProcessor(true); + public void supportedReturnTypesInDefaultResolutionMode() { + this.processor = new ModelAttributeMethodProcessor(true); assertThat(this.processor.supportsReturnType(returnParamNamedModelAttr)).isTrue(); assertThat(this.processor.supportsReturnType(returnParamNonSimpleType)).isTrue(); } @Test - public void bindExceptionRequired() throws Exception { + public void bindExceptionRequired() { assertThat(this.processor.isBindExceptionRequired(null, this.paramNonSimpleType)).isTrue(); assertThat(this.processor.isBindExceptionRequired(null, this.paramNamedValidModelAttr)).isFalse(); } @@ -227,11 +227,13 @@ public void resolveArgumentBindException() throws Exception { StubRequestDataBinder dataBinder = new StubRequestDataBinder(target, name); dataBinder.getBindingResult().reject("error"); + WebDataBinderFactory binderFactory = mock(); given(binderFactory.createBinder(this.request, target, name)).willReturn(dataBinder); - assertThatExceptionOfType(BindException.class).isThrownBy(() -> + assertThatExceptionOfType(MethodArgumentNotValidException.class).isThrownBy(() -> this.processor.resolveArgument(this.paramNonSimpleType, this.container, this.request, binderFactory)); + verify(binderFactory).createBinder(this.request, target, name); }