diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/method/annotation/support/RequestPartMethodArgumentResolver.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/method/annotation/support/RequestPartMethodArgumentResolver.java index 3e2c15f27e..70f4deed64 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/method/annotation/support/RequestPartMethodArgumentResolver.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/method/annotation/support/RequestPartMethodArgumentResolver.java @@ -135,20 +135,22 @@ public class RequestPartMethodArgumentResolver extends AbstractMessageConverterM try { HttpInputMessage inputMessage = new RequestPartServletServerHttpRequest(servletRequest, partName); arg = readWithMessageConverters(inputMessage, parameter, parameter.getParameterType()); - Annotation[] annotations = parameter.getParameterAnnotations(); - for (Annotation annot : annotations) { - if ("Valid".equals(annot.annotationType().getSimpleName())) { - WebDataBinder binder = binderFactory.createBinder(request, arg, partName); - Object hints = AnnotationUtils.getValue(annot); - binder.validate(hints instanceof Object[] ? (Object[]) hints : new Object[] {hints}); - BindingResult bindingResult = binder.getBindingResult(); - if (bindingResult.hasErrors()) { - throw new MethodArgumentNotValidException(parameter, bindingResult); + if (arg != null) { + Annotation[] annotations = parameter.getParameterAnnotations(); + for (Annotation annot : annotations) { + if ("Valid".equals(annot.annotationType().getSimpleName())) { + WebDataBinder binder = binderFactory.createBinder(request, arg, partName); + Object hints = AnnotationUtils.getValue(annot); + binder.validate(hints instanceof Object[] ? (Object[]) hints : new Object[] {hints}); + BindingResult bindingResult = binder.getBindingResult(); + if (bindingResult.hasErrors()) { + throw new MethodArgumentNotValidException(parameter, bindingResult); + } } } } } - catch (MissingServletRequestPartException e) { + catch (MissingServletRequestPartException ex) { // handled below arg = null; } @@ -193,26 +195,5 @@ public class RequestPartMethodArgumentResolver extends AbstractMessageConverterM } return false; } - - /** - * Whether to validate the given {@code @RequestPart} method argument. - * The default implementation looks for {@code @javax.validation.Valid}. - * @param argument the resolved argument value - * @param parameter the method argument - */ - protected boolean isValidationApplicable(Object argument, MethodParameter parameter) { - if (argument == null) { - return false; - } - else { - Annotation[] annotations = parameter.getParameterAnnotations(); - for (Annotation annot : annotations) { - if ("Valid".equals(annot.annotationType().getSimpleName())) { - return true; - } - } - return false; - } - } } diff --git a/org.springframework.web/src/test/java/org/springframework/web/method/annotation/support/ModelAttributeMethodProcessorTests.java b/org.springframework.web/src/test/java/org/springframework/web/method/annotation/support/ModelAttributeMethodProcessorTests.java index ad530bdcd1..91eddbc95e 100644 --- a/org.springframework.web/src/test/java/org/springframework/web/method/annotation/support/ModelAttributeMethodProcessorTests.java +++ b/org.springframework.web/src/test/java/org/springframework/web/method/annotation/support/ModelAttributeMethodProcessorTests.java @@ -16,29 +16,13 @@ package org.springframework.web.method.annotation.support; -import static java.lang.annotation.ElementType.CONSTRUCTOR; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.RUNTIME; -import static org.easymock.EasyMock.anyObject; -import static org.easymock.EasyMock.createMock; -import static org.easymock.EasyMock.eq; -import static org.easymock.EasyMock.expect; -import static org.easymock.EasyMock.notNull; -import static org.easymock.EasyMock.replay; -import static org.easymock.EasyMock.verify; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertTrue; - import java.lang.annotation.Retention; import java.lang.annotation.Target; import java.lang.reflect.Method; import org.junit.Before; import org.junit.Test; + import org.springframework.beans.TestBean; import org.springframework.core.MethodParameter; import org.springframework.mock.web.MockHttpServletRequest; @@ -54,6 +38,11 @@ import org.springframework.web.context.request.ServletWebRequest; import org.springframework.web.context.request.WebRequest; import org.springframework.web.method.support.ModelAndViewContainer; +import static java.lang.annotation.ElementType.*; +import static java.lang.annotation.RetentionPolicy.*; +import static org.easymock.EasyMock.*; +import static org.junit.Assert.*; + /** * Test fixture with {@link ModelAttributeMethodProcessor}. * @@ -254,6 +243,10 @@ public class ModelAttributeMethodProcessorTests { public void validate() { validateInvoked = true; } + + public void validate(Object... validationHints) { + validateInvoked = true; + } } @Target({ METHOD, FIELD, CONSTRUCTOR, PARAMETER })