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:
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user