AMQP-784: Fix multi method @RabbitListener

JIRA: https://jira.spring.io/browse/AMQP-784

When looking for matching methods, we matched on no annotation or @Payload.

Match should have been no annotation(s) or not @Header.

__cherry-pick to 1.7.x__
This commit is contained in:
Gary Russell
2017-11-17 11:44:29 -05:00
committed by Artem Bilan
parent 127d6aabc7
commit 1ddc74f233
2 changed files with 7 additions and 5 deletions

View File

@@ -37,6 +37,7 @@ import org.springframework.expression.ParserContext;
import org.springframework.expression.common.TemplateParserContext; import org.springframework.expression.common.TemplateParserContext;
import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.messaging.Message; import org.springframework.messaging.Message;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.messaging.handler.annotation.Payload; import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.messaging.handler.annotation.SendTo; import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.messaging.handler.invocation.InvocableHandlerMethod; import org.springframework.messaging.handler.invocation.InvocableHandlerMethod;
@@ -189,11 +190,11 @@ public class DelegatingInvocableHandler {
protected boolean matchHandlerMethod(Class<? extends Object> payloadClass, InvocableHandlerMethod handler) { protected boolean matchHandlerMethod(Class<? extends Object> payloadClass, InvocableHandlerMethod handler) {
Method method = handler.getMethod(); Method method = handler.getMethod();
Annotation[][] parameterAnnotations = method.getParameterAnnotations(); Annotation[][] parameterAnnotations = method.getParameterAnnotations();
// Single param; no annotation or @Payload // Single param; no annotation or not @Header
if (parameterAnnotations.length == 1) { if (parameterAnnotations.length == 1) {
MethodParameter methodParameter = new MethodParameter(method, 0); MethodParameter methodParameter = new MethodParameter(method, 0);
if (methodParameter.getParameterAnnotations().length == 0 if (methodParameter.getParameterAnnotations().length == 0
|| methodParameter.hasParameterAnnotation(Payload.class)) { || !methodParameter.hasParameterAnnotation(Header.class)) {
if (methodParameter.getParameterType().isAssignableFrom(payloadClass)) { if (methodParameter.getParameterType().isAssignableFrom(payloadClass)) {
return true; return true;
} }
@@ -203,7 +204,7 @@ public class DelegatingInvocableHandler {
for (int i = 0; i < parameterAnnotations.length; i++) { for (int i = 0; i < parameterAnnotations.length; i++) {
MethodParameter methodParameter = new MethodParameter(method, i); MethodParameter methodParameter = new MethodParameter(method, i);
if (methodParameter.getParameterAnnotations().length == 0 if (methodParameter.getParameterAnnotations().length == 0
|| methodParameter.hasParameterAnnotation(Payload.class)) { || !methodParameter.hasParameterAnnotation(Header.class)) {
if (methodParameter.getParameterType().isAssignableFrom(payloadClass)) { if (methodParameter.getParameterType().isAssignableFrom(payloadClass)) {
if (foundCandidate) { if (foundCandidate) {
throw new AmqpException("Ambiguous payload parameter for " + method.toGenericString()); throw new AmqpException("Ambiguous payload parameter for " + method.toGenericString());

View File

@@ -110,6 +110,7 @@ import org.springframework.core.PriorityOrdered;
import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.ConversionService;
import org.springframework.core.convert.converter.Converter; import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.lang.NonNull;
import org.springframework.messaging.converter.GenericMessageConverter; import org.springframework.messaging.converter.GenericMessageConverter;
import org.springframework.messaging.handler.annotation.Header; import org.springframework.messaging.handler.annotation.Header;
import org.springframework.messaging.handler.annotation.Payload; import org.springframework.messaging.handler.annotation.Payload;
@@ -1325,7 +1326,7 @@ public class EnableRabbitIntegrationTests {
@RabbitHandler @RabbitHandler
@SendTo("#{sendToRepliesBean}") @SendTo("#{sendToRepliesBean}")
public String bar(Bar bar) { public String bar(@NonNull Bar bar) {
return "BAR: " + bar.field; return "BAR: " + bar.field;
} }
@@ -1335,7 +1336,7 @@ public class EnableRabbitIntegrationTests {
} }
@RabbitHandler @RabbitHandler
public String qux(@Header("amqp_receivedRoutingKey") String rk, @Payload Qux qux) { public String qux(@Header("amqp_receivedRoutingKey") String rk, @NonNull @Payload Qux qux) {
return "QUX: " + qux.field + ": " + rk; return "QUX: " + qux.field + ": " + rk;
} }