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**
This commit is contained in:
Gary Russell
2020-12-16 12:12:42 -05:00
committed by GitHub
parent 3c5bf34aae
commit 072e8accc8
3 changed files with 20 additions and 3 deletions

View File

@@ -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 {

View File

@@ -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);

View File

@@ -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<String, Object> headers) {
}
}
private static class Foo {