Skip to content

Commit a2ac767

Browse files
committed
GH-2890: Fix MessagingMessageListenerAdapter for batch in Kotlin
Fixes: #2890 Issue link: #2890 The Kotlin function with signature `receiveBatch(messages: List<Message>)` produced a `WildCardType` for the generic of the `List` argument. * Fix `MessagingMessageListenerAdapter` to use `TypeUtils.isAssignable()` to determine if the `Type` has a part as expected type **Auto-cherry-pick to `3.1.x`**
1 parent 0c72649 commit a2ac767

File tree

2 files changed

+14
-9
lines changed

2 files changed

+14
-9
lines changed

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

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import org.springframework.messaging.handler.annotation.Headers;
4242
import org.springframework.messaging.handler.annotation.Payload;
4343
import org.springframework.util.Assert;
44+
import org.springframework.util.TypeUtils;
4445

4546
import com.rabbitmq.client.Channel;
4647

@@ -456,17 +457,18 @@ private Type extractGenericParameterTypFromMethodParameter(MethodParameter metho
456457
if (parameterizedType.getRawType().equals(Message.class)) {
457458
genericParameterType = ((ParameterizedType) genericParameterType).getActualTypeArguments()[0];
458459
}
459-
else if (this.isBatch
460-
&& ((parameterizedType.getRawType().equals(List.class)
461-
|| parameterizedType.getRawType().equals(Collection.class))
462-
&& parameterizedType.getActualTypeArguments().length == 1)) {
460+
else if (this.isBatch &&
461+
(parameterizedType.getRawType().equals(List.class) ||
462+
(parameterizedType.getRawType().equals(Collection.class) &&
463+
parameterizedType.getActualTypeArguments().length == 1))) {
463464

464465
this.isCollection = true;
465466
Type paramType = parameterizedType.getActualTypeArguments()[0];
466467
boolean messageHasGeneric = paramType instanceof ParameterizedType pType
467468
&& pType.getRawType().equals(Message.class);
468-
this.isMessageList = paramType.equals(Message.class) || messageHasGeneric;
469-
this.isAmqpMessageList = paramType.equals(org.springframework.amqp.core.Message.class);
469+
this.isMessageList = TypeUtils.isAssignable(paramType, Message.class) || messageHasGeneric;
470+
this.isAmqpMessageList =
471+
TypeUtils.isAssignable(paramType, org.springframework.amqp.core.Message.class);
470472
if (messageHasGeneric) {
471473
genericParameterType = ((ParameterizedType) paramType).getActualTypeArguments()[0];
472474
}

spring-rabbit/src/test/kotlin/org/springframework/amqp/rabbit/annotation/EnableRabbitKotlinTests.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@ package org.springframework.amqp.rabbit.annotation
1919
import assertk.assertThat
2020
import assertk.assertions.containsOnly
2121
import assertk.assertions.isEqualTo
22+
import assertk.assertions.isInstanceOf
2223
import assertk.assertions.isTrue
2324
import org.junit.jupiter.api.Test
2425
import org.springframework.amqp.core.AcknowledgeMode
26+
import org.springframework.amqp.core.Message
2527
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory
2628
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory
2729
import org.springframework.amqp.rabbit.core.RabbitTemplate
@@ -77,7 +79,8 @@ class EnableRabbitKotlinTests {
7779
template.convertAndSend("kotlinBatchQueue", "test1")
7880
template.convertAndSend("kotlinBatchQueue", "test2")
7981
assertThat(this.config.batchReceived.await(10, TimeUnit.SECONDS)).isTrue()
80-
assertThat(this.config.batch).containsOnly("test1", "test2")
82+
assertThat(this.config.batch[0]).isInstanceOf(Message::class.java)
83+
assertThat(this.config.batch.map { m -> String(m.body) }).containsOnly("test1", "test2")
8184
}
8285

8386
@Test
@@ -100,11 +103,11 @@ class EnableRabbitKotlinTests {
100103

101104
val batchReceived = CountDownLatch(1)
102105

103-
lateinit var batch: List<String>
106+
lateinit var batch: List<Message>
104107

105108
@RabbitListener(id = "batch", queues = ["kotlinBatchQueue"],
106109
containerFactory = "batchRabbitListenerContainerFactory")
107-
suspend fun receiveBatch(messages: List<String>) {
110+
suspend fun receiveBatch(messages: List<Message>) {
108111
batch = messages
109112
batchReceived.countDown()
110113
}

0 commit comments

Comments
 (0)