From b08f185a0b07caac0d46df5f8e3bbcf2e2b6f9d5 Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Wed, 5 Oct 2022 14:01:05 +0100 Subject: [PATCH] Use MethodArgumentNotValidException for model attributes Closes gh-29251 --- .../method/annotation/ModelAttributeMethodProcessor.java | 7 ++++--- .../method/annotation/ResponseEntityExceptionHandler.java | 3 +++ .../mvc/support/DefaultHandlerExceptionResolver.java | 3 +++ 3 files changed, 10 insertions(+), 3 deletions(-) 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 77489f0a9c3..78ad6ede2a7 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 @@ -50,6 +50,7 @@ import org.springframework.validation.Errors; import org.springframework.validation.SmartValidator; import org.springframework.validation.Validator; import org.springframework.validation.annotation.ValidationAnnotationUtils; +import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.support.WebDataBinderFactory; @@ -145,7 +146,7 @@ public class ModelAttributeMethodProcessor implements HandlerMethodArgumentResol try { attribute = createAttribute(name, parameter, binderFactory, webRequest); } - catch (BindException ex) { + catch (MethodArgumentNotValidException ex) { if (isBindExceptionRequired(parameter)) { // No BindingResult parameter -> fail with BindException throw ex; @@ -314,7 +315,7 @@ public class ModelAttributeMethodProcessor implements HandlerMethodArgumentResol if (!parameter.isOptional()) { try { Object target = BeanUtils.instantiateClass(ctor, args); - throw new BindException(result) { + throw new MethodArgumentNotValidException(parameter, result) { @Override public Object getTarget() { return target; @@ -325,7 +326,7 @@ public class ModelAttributeMethodProcessor implements HandlerMethodArgumentResol // swallow and proceed without target instance } } - throw new BindException(result); + throw new MethodArgumentNotValidException(parameter, result); } return BeanUtils.instantiateClass(ctor, args); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseEntityExceptionHandler.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseEntityExceptionHandler.java index 1c33945f459..1da0808ee4c 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseEntityExceptionHandler.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseEntityExceptionHandler.java @@ -472,8 +472,11 @@ public abstract class ResponseEntityExceptionHandler implements MessageSourceAwa * @param request the current request * @return a {@code ResponseEntity} for the response to use, possibly * {@code null} when the response is already committed + * @deprecated as of 6.0 since {@link org.springframework.web.method.annotation.ModelAttributeMethodProcessor} + * now raises the {@link MethodArgumentNotValidException} subclass instead. */ @Nullable + @Deprecated(since = "6.0", forRemoval = true) protected ResponseEntity handleBindException( BindException ex, HttpHeaders headers, HttpStatusCode status, WebRequest request) { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/support/DefaultHandlerExceptionResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/support/DefaultHandlerExceptionResolver.java index 92823b35db6..11bbce9859d 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/support/DefaultHandlerExceptionResolver.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/support/DefaultHandlerExceptionResolver.java @@ -574,7 +574,10 @@ public class DefaultHandlerExceptionResolver extends AbstractHandlerExceptionRes * @param handler the executed handler * @return an empty {@code ModelAndView} indicating the exception was handled * @throws IOException potentially thrown from {@link HttpServletResponse#sendError} + * @deprecated as of 6.0 since {@link org.springframework.web.method.annotation.ModelAttributeMethodProcessor} + * now raises the {@link MethodArgumentNotValidException} subclass instead. */ + @Deprecated(since = "6.0", forRemoval = true) protected ModelAndView handleBindException(BindException ex, HttpServletRequest request, HttpServletResponse response, @Nullable Object handler) throws IOException {