PayloadArgumentResolver has useDefaultResolution flag

Issue: SPR-14937
This commit is contained in:
Rossen Stoyanchev 2016-11-28 17:00:22 -05:00
parent 122334c37a
commit a203b74d20
2 changed files with 42 additions and 11 deletions

View File

@ -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

View File

@ -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 {