Skip to content

Commit 39c9c44

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 fed2f31 commit 39c9c44

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
@@ -131,6 +131,7 @@
131131
import org.springframework.transaction.annotation.EnableTransactionManagement;
132132
import org.springframework.transaction.annotation.Transactional;
133133
import org.springframework.util.ErrorHandler;
134+
import org.springframework.validation.annotation.Validated;
134135

135136
import com.rabbitmq.client.Channel;
136137
import com.rabbitmq.http.client.Client;
@@ -1148,8 +1149,9 @@ public void handleIt(Date body) {
11481149

11491150
}
11501151

1151-
@RabbitListener(id = "different", queues = "differentTypes", containerFactory = "jsonListenerContainerFactory")
1152-
public void handleDifferent(Foo2 foo) {
1152+
@RabbitListener(id = "different", queues = "differentTypes",
1153+
containerFactory = "jsonListenerContainerFactoryNoClassMapper")
1154+
public void handleDifferent(@Validated Foo2 foo) {
11531155
foos.add(foo);
11541156
latch.countDown();
11551157
}
@@ -1592,6 +1594,19 @@ public SimpleRabbitListenerContainerFactory jsonListenerContainerFactory() {
15921594
return factory;
15931595
}
15941596

1597+
@Bean
1598+
public SimpleRabbitListenerContainerFactory jsonListenerContainerFactoryNoClassMapper() {
1599+
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
1600+
factory.setConnectionFactory(rabbitConnectionFactory());
1601+
factory.setErrorHandler(errorHandler());
1602+
factory.setConsumerTagStrategy(consumerTagStrategy());
1603+
Jackson2JsonMessageConverter messageConverter = new Jackson2JsonMessageConverter();
1604+
factory.setMessageConverter(messageConverter);
1605+
factory.setReceiveTimeout(10L);
1606+
factory.setConcurrentConsumers(2);
1607+
return factory;
1608+
}
1609+
15951610
@Bean
15961611
public MeterRegistry meterRegistry() {
15971612
return new SimpleMeterRegistry();
@@ -2189,7 +2204,7 @@ public String foo2(Foo2 foo2, @Header("amqp_consumerQueue") String queue) {
21892204
}
21902205

21912206
@RabbitListener(queues = "test.converted.args2")
2192-
public String foo2a(@Payload Foo2 foo2, @Header("amqp_consumerQueue") String queue) {
2207+
public String foo2a(Foo2 foo2, @Header("amqp_consumerQueue") String queue) {
21932208
return foo2 + queue;
21942209
}
21952210

0 commit comments

Comments
 (0)