Skip to content

Commit 048ca4e

Browse files
garyrussellartembilan
authored andcommitted
GH-1269: @RabbitListener: Allow other Annotations
Resolves #1269 Previously, a parameter annotated with a "foreign" annoation (e.g. `@Validated`) would not be considered as an eligible payload conversion target; it must also have been annotated with `@Payload`. - remove the check for zero annotations - add a check that the method is not annotated with both `@Payload` and `@Header` - ignore if it does, with a warn log, to be consistent with previous behavior. - in a future release we might consider this to be fatal. **cherry-pick to 2.2.x**
1 parent 1d669cd commit 048ca4e

File tree

2 files changed

+31
-6
lines changed

2 files changed

+31
-6
lines changed

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

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.springframework.lang.Nullable;
3535
import org.springframework.messaging.Message;
3636
import org.springframework.messaging.MessagingException;
37+
import org.springframework.messaging.handler.annotation.Header;
3738
import org.springframework.messaging.handler.annotation.Payload;
3839
import org.springframework.messaging.support.MessageBuilder;
3940
import org.springframework.remoting.support.RemoteInvocationResult;
@@ -333,12 +334,21 @@ private Type determineInferredType() {
333334
for (int i = 0; i < this.method.getParameterCount(); i++) {
334335
MethodParameter methodParameter = new MethodParameter(this.method, i);
335336
/*
336-
* We're looking for a single non-annotated parameter, or one annotated with @Payload.
337+
* We're looking for a single parameter, or one annotated with @Payload.
337338
* We ignore parameters with type Message because they are not involved with conversion.
338339
*/
340+
boolean isHeader = methodParameter.hasParameterAnnotation(Header.class);
341+
boolean isPayload = methodParameter.hasParameterAnnotation(Payload.class);
342+
if (isHeader && isPayload) {
343+
if (MessagingMessageListenerAdapter.this.logger.isWarnEnabled()) {
344+
MessagingMessageListenerAdapter.this.logger.warn(this.method.getName()
345+
+ ": Cannot annotate a parameter with both @Header and @Payload; "
346+
+ "ignored for payload conversion");
347+
}
348+
}
339349
if (isEligibleParameter(methodParameter)
340-
&& (methodParameter.getParameterAnnotations().length == 0
341-
|| methodParameter.hasParameterAnnotation(Payload.class))) {
350+
&& (!isHeader || isPayload) && !(isHeader && isPayload)) {
351+
342352
if (genericParameterType == null) {
343353
genericParameterType = extractGenericParameterTypFromMethodParameter(methodParameter);
344354
}

spring-rabbit/src/test/java/org/springframework/amqp/rabbit/annotation/EnableRabbitIntegrationTests.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@
130130
import org.springframework.transaction.annotation.EnableTransactionManagement;
131131
import org.springframework.transaction.annotation.Transactional;
132132
import org.springframework.util.ErrorHandler;
133+
import org.springframework.validation.annotation.Validated;
133134

134135
import com.rabbitmq.client.Channel;
135136
import com.rabbitmq.http.client.Client;
@@ -1137,8 +1138,9 @@ public void handleIt(Date body) {
11371138

11381139
}
11391140

1140-
@RabbitListener(id = "different", queues = "differentTypes", containerFactory = "jsonListenerContainerFactory")
1141-
public void handleDifferent(Foo2 foo) {
1141+
@RabbitListener(id = "different", queues = "differentTypes",
1142+
containerFactory = "jsonListenerContainerFactoryNoClassMapper")
1143+
public void handleDifferent(@Validated Foo2 foo) {
11421144
foos.add(foo);
11431145
latch.countDown();
11441146
}
@@ -1581,6 +1583,19 @@ public SimpleRabbitListenerContainerFactory jsonListenerContainerFactory() {
15811583
return factory;
15821584
}
15831585

1586+
@Bean
1587+
public SimpleRabbitListenerContainerFactory jsonListenerContainerFactoryNoClassMapper() {
1588+
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
1589+
factory.setConnectionFactory(rabbitConnectionFactory());
1590+
factory.setErrorHandler(errorHandler());
1591+
factory.setConsumerTagStrategy(consumerTagStrategy());
1592+
Jackson2JsonMessageConverter messageConverter = new Jackson2JsonMessageConverter();
1593+
factory.setMessageConverter(messageConverter);
1594+
factory.setReceiveTimeout(10L);
1595+
factory.setConcurrentConsumers(2);
1596+
return factory;
1597+
}
1598+
15841599
@Bean
15851600
public MeterRegistry meterRegistry() {
15861601
return new SimpleMeterRegistry();
@@ -2178,7 +2193,7 @@ public String foo2(Foo2 foo2, @Header("amqp_consumerQueue") String queue) {
21782193
}
21792194

21802195
@RabbitListener(queues = "test.converted.args2")
2181-
public String foo2a(@Payload Foo2 foo2, @Header("amqp_consumerQueue") String queue) {
2196+
public String foo2a(Foo2 foo2, @Header("amqp_consumerQueue") String queue) {
21822197
return foo2 + queue;
21832198
}
21842199

0 commit comments

Comments
 (0)