Skip to content

Commit 4f4d0c5

Browse files
garyrussellartembilan
authored andcommitted
AMQP-784: Fix multi method @RabbitListener
JIRA: https://jira.spring.io/browse/AMQP-784 When looking for matching methods, we matched on no annotation or @payload. Match should have been no annotation(s) or not @Header. __cherry-pick to 1.7.x__ (cherry picked from commit 1ddc74f) * Replace `@NonNull` with the `@Validated` for Spring `4.3` support
1 parent adf406c commit 4f4d0c5

File tree

2 files changed

+7
-5
lines changed

2 files changed

+7
-5
lines changed

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.springframework.expression.common.TemplateParserContext;
3838
import org.springframework.expression.spel.standard.SpelExpressionParser;
3939
import org.springframework.messaging.Message;
40+
import org.springframework.messaging.handler.annotation.Header;
4041
import org.springframework.messaging.handler.annotation.Payload;
4142
import org.springframework.messaging.handler.annotation.SendTo;
4243
import org.springframework.messaging.handler.invocation.InvocableHandlerMethod;
@@ -189,11 +190,11 @@ protected InvocableHandlerMethod findHandlerForPayload(Class<? extends Object> p
189190
protected boolean matchHandlerMethod(Class<? extends Object> payloadClass, InvocableHandlerMethod handler) {
190191
Method method = handler.getMethod();
191192
Annotation[][] parameterAnnotations = method.getParameterAnnotations();
192-
// Single param; no annotation or @Payload
193+
// Single param; no annotation or not @Header
193194
if (parameterAnnotations.length == 1) {
194195
MethodParameter methodParameter = new MethodParameter(method, 0);
195196
if (methodParameter.getParameterAnnotations().length == 0
196-
|| methodParameter.hasParameterAnnotation(Payload.class)) {
197+
|| !methodParameter.hasParameterAnnotation(Header.class)) {
197198
if (methodParameter.getParameterType().isAssignableFrom(payloadClass)) {
198199
return true;
199200
}
@@ -203,7 +204,7 @@ protected boolean matchHandlerMethod(Class<? extends Object> payloadClass, Invoc
203204
for (int i = 0; i < parameterAnnotations.length; i++) {
204205
MethodParameter methodParameter = new MethodParameter(method, i);
205206
if (methodParameter.getParameterAnnotations().length == 0
206-
|| methodParameter.hasParameterAnnotation(Payload.class)) {
207+
|| !methodParameter.hasParameterAnnotation(Header.class)) {
207208
if (methodParameter.getParameterType().isAssignableFrom(payloadClass)) {
208209
if (foundCandidate) {
209210
throw new AmqpException("Ambiguous payload parameter for " + method.toGenericString());

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@
124124
import org.springframework.transaction.annotation.EnableTransactionManagement;
125125
import org.springframework.transaction.annotation.Transactional;
126126
import org.springframework.util.ErrorHandler;
127+
import org.springframework.validation.annotation.Validated;
127128

128129
import com.rabbitmq.client.Channel;
129130

@@ -1172,7 +1173,7 @@ static class MultiListenerBean {
11721173

11731174
@RabbitHandler
11741175
@SendTo("#{sendToRepliesBean}")
1175-
public String bar(Bar bar) {
1176+
public String bar(@Validated Bar bar) {
11761177
return "BAR: " + bar.field;
11771178
}
11781179

@@ -1182,7 +1183,7 @@ public String baz(Baz baz) {
11821183
}
11831184

11841185
@RabbitHandler
1185-
public String qux(@Header("amqp_receivedRoutingKey") String rk, @Payload Qux qux) {
1186+
public String qux(@Header("amqp_receivedRoutingKey") String rk, @Validated @Payload Qux qux) {
11861187
return "QUX: " + qux.field + ": " + rk;
11871188
}
11881189

0 commit comments

Comments
 (0)