From 072e8accc83ec284e216c4e02f3c7f6923dd7c76 Mon Sep 17 00:00:00 2001 From: Gary Russell Date: Wed, 16 Dec 2020 12:12:42 -0500 Subject: [PATCH] GH-1285: Fix @RabbitListener with @Headers Resolves https://github.com/spring-projects/spring-amqp/issues/1285 * Add gradle plugin repo. **cherry-pick to 2.2.x** --- build.gradle | 1 + .../adapter/MessagingMessageListenerAdapter.java | 8 +++++--- .../MessagingMessageListenerAdapterTests.java | 14 ++++++++++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index b0387cd5..e742b460 100644 --- a/build.gradle +++ b/build.gradle @@ -2,6 +2,7 @@ buildscript { ext.kotlinVersion = '1.3.61' repositories { mavenCentral() + maven { url 'https://plugins.gradle.org/m2' } maven { url 'https://repo.spring.io/plugins-release' } } dependencies { diff --git a/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/listener/adapter/MessagingMessageListenerAdapter.java b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/listener/adapter/MessagingMessageListenerAdapter.java index d58efe5d..22c73110 100644 --- a/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/listener/adapter/MessagingMessageListenerAdapter.java +++ b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/listener/adapter/MessagingMessageListenerAdapter.java @@ -35,6 +35,7 @@ import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.messaging.MessagingException; import org.springframework.messaging.handler.annotation.Header; +import org.springframework.messaging.handler.annotation.Headers; import org.springframework.messaging.handler.annotation.Payload; import org.springframework.messaging.support.MessageBuilder; import org.springframework.remoting.support.RemoteInvocationResult; @@ -337,15 +338,16 @@ public class MessagingMessageListenerAdapter extends AbstractAdaptableMessageLis * We're looking for a single parameter, or one annotated with @Payload. * We ignore parameters with type Message because they are not involved with conversion. */ - boolean isHeader = methodParameter.hasParameterAnnotation(Header.class); + boolean isHeaderOrHeaders = methodParameter.hasParameterAnnotation(Header.class) + || methodParameter.hasParameterAnnotation(Headers.class); boolean isPayload = methodParameter.hasParameterAnnotation(Payload.class); - if (isHeader && isPayload && MessagingMessageListenerAdapter.this.logger.isWarnEnabled()) { + if (isHeaderOrHeaders && isPayload && MessagingMessageListenerAdapter.this.logger.isWarnEnabled()) { MessagingMessageListenerAdapter.this.logger.warn(this.method.getName() + ": Cannot annotate a parameter with both @Header and @Payload; " + "ignored for payload conversion"); } if (isEligibleParameter(methodParameter) // NOSONAR - && (!isHeader || isPayload) && !(isHeader && isPayload)) { + && (!isHeaderOrHeaders || isPayload) && !(isHeaderOrHeaders && isPayload)) { if (genericParameterType == null) { genericParameterType = extractGenericParameterTypFromMethodParameter(methodParameter); diff --git a/spring-rabbit/src/test/java/org/springframework/amqp/rabbit/listener/adapter/MessagingMessageListenerAdapterTests.java b/spring-rabbit/src/test/java/org/springframework/amqp/rabbit/listener/adapter/MessagingMessageListenerAdapterTests.java index aad93cdf..ea1abdd4 100644 --- a/spring-rabbit/src/test/java/org/springframework/amqp/rabbit/listener/adapter/MessagingMessageListenerAdapterTests.java +++ b/spring-rabbit/src/test/java/org/springframework/amqp/rabbit/listener/adapter/MessagingMessageListenerAdapterTests.java @@ -28,6 +28,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; import org.junit.jupiter.api.BeforeEach; @@ -39,8 +40,10 @@ import org.springframework.amqp.rabbit.test.MessageTestUtils; import org.springframework.amqp.support.AmqpHeaders; import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; import org.springframework.amqp.support.converter.SimpleMessageConverter; +import org.springframework.amqp.utils.test.TestUtils; import org.springframework.beans.factory.support.StaticListableBeanFactory; import org.springframework.messaging.Message; +import org.springframework.messaging.handler.annotation.Headers; import org.springframework.messaging.handler.annotation.support.DefaultMessageHandlerMethodFactory; import org.springframework.messaging.handler.invocation.InvocableHandlerMethod; import org.springframework.messaging.support.MessageBuilder; @@ -192,6 +195,13 @@ public class MessagingMessageListenerAdapterTests { assertThat(this.sample.payload.getClass()).isEqualTo(LinkedHashMap.class); } + @Test + void headers() throws Exception { + MessagingMessageListenerAdapter listener = getSimpleInstance("withHeaders", Foo.class, Map.class); + assertThat(TestUtils.getPropertyValue(listener, "messagingMessageConverter.inferredArgumentType")) + .isEqualTo(Foo.class); + } + @Test public void genericMessageTest2() throws Exception { org.springframework.amqp.core.Message message = MessageTestUtils.createTextMessage("{ \"foo\" : \"bar\" }"); @@ -378,6 +388,10 @@ public class MessagingMessageListenerAdapterTests { throw new IllegalArgumentException("Expected test exception"); } + @SuppressWarnings("unused") + public void withHeaders(Foo foo, @Headers Map headers) { + } + } private static class Foo {