diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/PayloadArgumentResolver.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/PayloadArgumentResolver.java index d14a4878e8..7230395243 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/PayloadArgumentResolver.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/PayloadArgumentResolver.java @@ -56,6 +56,8 @@ public class PayloadArgumentResolver implements HandlerMethodArgumentResolver { private final Validator validator; + private final boolean useDefaultResolution; + /** * Create a new {@code PayloadArgumentResolver} with the given @@ -74,15 +76,31 @@ public class PayloadArgumentResolver implements HandlerMethodArgumentResolver { * @param validator the Validator to use (optional) */ public PayloadArgumentResolver(MessageConverter messageConverter, Validator validator) { + this(messageConverter, validator, true); + } + + /** + * Create a new {@code PayloadArgumentResolver} with the given + * {@link MessageConverter} and {@link Validator}. + * @param messageConverter the MessageConverter to use (required) + * @param validator the Validator to use (optional) + * @param useDefaultResolution if "true" (the default) this resolver supports + * all parameters; if "false" then only arguments with the {@code @Payload} + * annotation are supported. + */ + public PayloadArgumentResolver(MessageConverter messageConverter, Validator validator, + boolean useDefaultResolution) { + Assert.notNull(messageConverter, "MessageConverter must not be null"); this.converter = messageConverter; this.validator = validator; + this.useDefaultResolution = useDefaultResolution; } @Override public boolean supportsParameter(MethodParameter parameter) { - return true; + return (parameter.hasParameterAnnotation(Payload.class) || this.useDefaultResolution); } @Override diff --git a/spring-messaging/src/test/java/org/springframework/messaging/handler/annotation/support/PayloadArgumentResolverTests.java b/spring-messaging/src/test/java/org/springframework/messaging/handler/annotation/support/PayloadArgumentResolverTests.java index 33a098221e..4112e27a07 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/handler/annotation/support/PayloadArgumentResolverTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/handler/annotation/support/PayloadArgumentResolverTests.java @@ -53,8 +53,6 @@ public class PayloadArgumentResolverTests { private PayloadArgumentResolver resolver; - private Method payloadMethod; - private MethodParameter paramAnnotated; private MethodParameter paramAnnotatedNotRequired; @@ -76,20 +74,35 @@ public class PayloadArgumentResolverTests { @Before public void setup() throws Exception { - this.resolver = new PayloadArgumentResolver(new StringMessageConverter(), testValidator()); - this.payloadMethod = PayloadArgumentResolverTests.class.getDeclaredMethod("handleMessage", - String.class, String.class, Locale.class, String.class, String.class, String.class, String.class); - this.paramAnnotated = new SynthesizingMethodParameter(this.payloadMethod, 0); - this.paramAnnotatedNotRequired = new SynthesizingMethodParameter(this.payloadMethod, 1); + this.resolver = new PayloadArgumentResolver(new StringMessageConverter(), testValidator()); + + Method payloadMethod = PayloadArgumentResolverTests.class.getDeclaredMethod( + "handleMessage", String.class, String.class, Locale.class, + String.class, String.class, String.class, String.class); + + this.paramAnnotated = new SynthesizingMethodParameter(payloadMethod, 0); + this.paramAnnotatedNotRequired = new SynthesizingMethodParameter(payloadMethod, 1); this.paramAnnotatedRequired = new SynthesizingMethodParameter(payloadMethod, 2); this.paramWithSpelExpression = new SynthesizingMethodParameter(payloadMethod, 3); - this.paramValidated = new SynthesizingMethodParameter(this.payloadMethod, 4); + this.paramValidated = new SynthesizingMethodParameter(payloadMethod, 4); this.paramValidated.initParameterNameDiscovery(new LocalVariableTableParameterNameDiscoverer()); - this.paramValidatedNotAnnotated = new SynthesizingMethodParameter(this.payloadMethod, 5); - this.paramNotAnnotated = new SynthesizingMethodParameter(this.payloadMethod, 6); + this.paramValidatedNotAnnotated = new SynthesizingMethodParameter(payloadMethod, 5); + this.paramNotAnnotated = new SynthesizingMethodParameter(payloadMethod, 6); } + @Test + public void supportsParameter() throws Exception { + + assertTrue(this.resolver.supportsParameter(this.paramAnnotated)); + assertTrue(this.resolver.supportsParameter(this.paramNotAnnotated)); + + PayloadArgumentResolver strictResolver = new PayloadArgumentResolver( + new StringMessageConverter(), testValidator(), false); + + assertTrue(strictResolver.supportsParameter(this.paramAnnotated)); + assertFalse(strictResolver.supportsParameter(this.paramNotAnnotated)); + } @Test public void resolveRequired() throws Exception {