Skip to content

Commit

Permalink
GH-1285: Fix @RabbitListener with @headers
Browse files Browse the repository at this point in the history
Resolves #1285

* Add gradle plugin repo.

**cherry-pick to 2.2.x**
# Conflicts:
#	build.gradle
#	spring-rabbit/src/main/java/org/springframework/amqp/rabbit/listener/adapter/MessagingMessageListenerAdapter.java
  • Loading branch information
garyrussell authored and artembilan committed Dec 16, 2020
1 parent d98569c commit 917d6e9
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 8 deletions.
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
buildscript {
ext.kotlinVersion = '1.3.72'
repositories {
maven { url 'https://plugins.gradle.org/m2' }
maven { url 'https://repo.spring.io/plugins-release' }
}
dependencies {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
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;
Expand Down Expand Up @@ -337,17 +338,16 @@ private Type determineInferredType() {
* 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) {
if (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 (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)
&& (!isHeader || isPayload) && !(isHeader && isPayload)) {
&& (!isHeaderOrHeaders || isPayload) && !(isHeaderOrHeaders && isPayload)) {

if (genericParameterType == null) {
genericParameterType = extractGenericParameterTypFromMethodParameter(methodParameter);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
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;
Expand All @@ -39,8 +40,10 @@
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;
Expand Down Expand Up @@ -192,6 +195,13 @@ public void genericMessageTest1() throws Exception {
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\" }");
Expand Down Expand Up @@ -378,6 +388,10 @@ public String failWithReturn(Integer input) {
throw new IllegalArgumentException("Expected test exception");
}

@SuppressWarnings("unused")
public void withHeaders(Foo foo, @Headers Map<String, Object> headers) {
}

}

private static class Foo {
Expand Down

0 comments on commit 917d6e9

Please sign in to comment.