Skip to content

Commit 072e8ac

Browse files
authored
GH-1285: Fix @RabbitListener with @headers
Resolves #1285 * Add gradle plugin repo. **cherry-pick to 2.2.x**
1 parent 3c5bf34 commit 072e8ac

File tree

3 files changed

+20
-3
lines changed

3 files changed

+20
-3
lines changed

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ buildscript {
22
ext.kotlinVersion = '1.3.61'
33
repositories {
44
mavenCentral()
5+
maven { url 'https://plugins.gradle.org/m2' }
56
maven { url 'https://repo.spring.io/plugins-release' }
67
}
78
dependencies {

spring-rabbit/src/main/java/org/springframework/amqp/rabbit/listener/adapter/MessagingMessageListenerAdapter.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.springframework.messaging.Message;
3636
import org.springframework.messaging.MessagingException;
3737
import org.springframework.messaging.handler.annotation.Header;
38+
import org.springframework.messaging.handler.annotation.Headers;
3839
import org.springframework.messaging.handler.annotation.Payload;
3940
import org.springframework.messaging.support.MessageBuilder;
4041
import org.springframework.remoting.support.RemoteInvocationResult;
@@ -337,15 +338,16 @@ private Type determineInferredType() { // NOSONAR - complexity
337338
* We're looking for a single parameter, or one annotated with @Payload.
338339
* We ignore parameters with type Message because they are not involved with conversion.
339340
*/
340-
boolean isHeader = methodParameter.hasParameterAnnotation(Header.class);
341+
boolean isHeaderOrHeaders = methodParameter.hasParameterAnnotation(Header.class)
342+
|| methodParameter.hasParameterAnnotation(Headers.class);
341343
boolean isPayload = methodParameter.hasParameterAnnotation(Payload.class);
342-
if (isHeader && isPayload && MessagingMessageListenerAdapter.this.logger.isWarnEnabled()) {
344+
if (isHeaderOrHeaders && isPayload && MessagingMessageListenerAdapter.this.logger.isWarnEnabled()) {
343345
MessagingMessageListenerAdapter.this.logger.warn(this.method.getName()
344346
+ ": Cannot annotate a parameter with both @Header and @Payload; "
345347
+ "ignored for payload conversion");
346348
}
347349
if (isEligibleParameter(methodParameter) // NOSONAR
348-
&& (!isHeader || isPayload) && !(isHeader && isPayload)) {
350+
&& (!isHeaderOrHeaders || isPayload) && !(isHeaderOrHeaders && isPayload)) {
349351

350352
if (genericParameterType == null) {
351353
genericParameterType = extractGenericParameterTypFromMethodParameter(methodParameter);

spring-rabbit/src/test/java/org/springframework/amqp/rabbit/listener/adapter/MessagingMessageListenerAdapterTests.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import java.util.Arrays;
2929
import java.util.LinkedHashMap;
3030
import java.util.List;
31+
import java.util.Map;
3132
import java.util.stream.Collectors;
3233

3334
import org.junit.jupiter.api.BeforeEach;
@@ -39,8 +40,10 @@
3940
import org.springframework.amqp.support.AmqpHeaders;
4041
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
4142
import org.springframework.amqp.support.converter.SimpleMessageConverter;
43+
import org.springframework.amqp.utils.test.TestUtils;
4244
import org.springframework.beans.factory.support.StaticListableBeanFactory;
4345
import org.springframework.messaging.Message;
46+
import org.springframework.messaging.handler.annotation.Headers;
4447
import org.springframework.messaging.handler.annotation.support.DefaultMessageHandlerMethodFactory;
4548
import org.springframework.messaging.handler.invocation.InvocableHandlerMethod;
4649
import org.springframework.messaging.support.MessageBuilder;
@@ -192,6 +195,13 @@ public void genericMessageTest1() throws Exception {
192195
assertThat(this.sample.payload.getClass()).isEqualTo(LinkedHashMap.class);
193196
}
194197

198+
@Test
199+
void headers() throws Exception {
200+
MessagingMessageListenerAdapter listener = getSimpleInstance("withHeaders", Foo.class, Map.class);
201+
assertThat(TestUtils.getPropertyValue(listener, "messagingMessageConverter.inferredArgumentType"))
202+
.isEqualTo(Foo.class);
203+
}
204+
195205
@Test
196206
public void genericMessageTest2() throws Exception {
197207
org.springframework.amqp.core.Message message = MessageTestUtils.createTextMessage("{ \"foo\" : \"bar\" }");
@@ -378,6 +388,10 @@ public String failWithReturn(Integer input) {
378388
throw new IllegalArgumentException("Expected test exception");
379389
}
380390

391+
@SuppressWarnings("unused")
392+
public void withHeaders(Foo foo, @Headers Map<String, Object> headers) {
393+
}
394+
381395
}
382396

383397
private static class Foo {

0 commit comments

Comments
 (0)