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:
committed by
Artem Bilan
parent
127d6aabc7
commit
1ddc74f233
@@ -37,6 +37,7 @@ import org.springframework.expression.ParserContext;
|
||||
import org.springframework.expression.common.TemplateParserContext;
|
||||
import org.springframework.expression.spel.standard.SpelExpressionParser;
|
||||
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.SendTo;
|
||||
import org.springframework.messaging.handler.invocation.InvocableHandlerMethod;
|
||||
@@ -189,11 +190,11 @@ public class DelegatingInvocableHandler {
|
||||
protected boolean matchHandlerMethod(Class<? extends Object> payloadClass, InvocableHandlerMethod handler) {
|
||||
Method method = handler.getMethod();
|
||||
Annotation[][] parameterAnnotations = method.getParameterAnnotations();
|
||||
// Single param; no annotation or @Payload
|
||||
// Single param; no annotation or not @Header
|
||||
if (parameterAnnotations.length == 1) {
|
||||
MethodParameter methodParameter = new MethodParameter(method, 0);
|
||||
if (methodParameter.getParameterAnnotations().length == 0
|
||||
|| methodParameter.hasParameterAnnotation(Payload.class)) {
|
||||
|| !methodParameter.hasParameterAnnotation(Header.class)) {
|
||||
if (methodParameter.getParameterType().isAssignableFrom(payloadClass)) {
|
||||
return true;
|
||||
}
|
||||
@@ -203,7 +204,7 @@ public class DelegatingInvocableHandler {
|
||||
for (int i = 0; i < parameterAnnotations.length; i++) {
|
||||
MethodParameter methodParameter = new MethodParameter(method, i);
|
||||
if (methodParameter.getParameterAnnotations().length == 0
|
||||
|| methodParameter.hasParameterAnnotation(Payload.class)) {
|
||||
|| !methodParameter.hasParameterAnnotation(Header.class)) {
|
||||
if (methodParameter.getParameterType().isAssignableFrom(payloadClass)) {
|
||||
if (foundCandidate) {
|
||||
throw new AmqpException("Ambiguous payload parameter for " + method.toGenericString());
|
||||
|
||||
@@ -110,6 +110,7 @@ import org.springframework.core.PriorityOrdered;
|
||||
import org.springframework.core.convert.ConversionService;
|
||||
import org.springframework.core.convert.converter.Converter;
|
||||
import org.springframework.core.convert.support.DefaultConversionService;
|
||||
import org.springframework.lang.NonNull;
|
||||
import org.springframework.messaging.converter.GenericMessageConverter;
|
||||
import org.springframework.messaging.handler.annotation.Header;
|
||||
import org.springframework.messaging.handler.annotation.Payload;
|
||||
@@ -1325,7 +1326,7 @@ public class EnableRabbitIntegrationTests {
|
||||
|
||||
@RabbitHandler
|
||||
@SendTo("#{sendToRepliesBean}")
|
||||
public String bar(Bar bar) {
|
||||
public String bar(@NonNull Bar bar) {
|
||||
return "BAR: " + bar.field;
|
||||
}
|
||||
|
||||
@@ -1335,7 +1336,7 @@ public class EnableRabbitIntegrationTests {
|
||||
}
|
||||
|
||||
@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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user