diff --git a/spring-integration-core/src/main/java/org/springframework/integration/util/MessagingMethodInvokerHelper.java b/spring-integration-core/src/main/java/org/springframework/integration/util/MessagingMethodInvokerHelper.java index 0811c564ff..751aa5eb2f 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/util/MessagingMethodInvokerHelper.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/util/MessagingMethodInvokerHelper.java @@ -702,7 +702,8 @@ public class MessagingMethodInvokerHelper extends AbstractExpressionEvaluator } HandlerMethod handlerMethod1; try { - method1 = org.springframework.util.ClassUtils.getMostSpecificMethod(method1, targetObject.getClass()); + method1 = AopUtils.selectInvocableMethod(method1, + org.springframework.util.ClassUtils.getUserClass(targetObject)); InvocableHandlerMethod invocableHandlerMethod = this.messageHandlerMethodFactory.createInvocableHandlerMethod(targetObject, method1); handlerMethod1 = new HandlerMethod(invocableHandlerMethod, this.canProcessMessageList); diff --git a/spring-integration-core/src/test/java/org/springframework/integration/handler/MethodInvokingMessageProcessorTests.java b/spring-integration-core/src/test/java/org/springframework/integration/handler/MethodInvokingMessageProcessorTests.java index fd546af685..f88e005438 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/handler/MethodInvokingMessageProcessorTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/handler/MethodInvokingMessageProcessorTests.java @@ -37,6 +37,7 @@ import java.util.LinkedHashMap; import java.util.Map; import java.util.Optional; import java.util.Properties; +import java.util.UUID; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; @@ -74,6 +75,7 @@ import org.springframework.messaging.MessageHandlingException; import org.springframework.messaging.MessageHeaders; import org.springframework.messaging.MessagingException; import org.springframework.messaging.handler.annotation.Header; +import org.springframework.messaging.handler.annotation.Payload; import org.springframework.messaging.support.GenericMessage; import org.springframework.util.StopWatch; @@ -809,6 +811,42 @@ public class MethodInvokingMessageProcessorTests { assertTrue(adviceCalled.get()); } + @Test + public void testProxyAndHeaderAnnotation() { + final AtomicReference payloadReference = new AtomicReference<>(); + final AtomicReference idReference = new AtomicReference<>(); + + class MyHandler { + + public void handle(@Header(MessageHeaders.ID) UUID id, @Payload Object payload) { + idReference.set(id); + payloadReference.set(payload); + } + + } + + MyHandler service = new MyHandler(); + + final AtomicBoolean adviceCalled = new AtomicBoolean(); + ProxyFactory proxyFactory = new ProxyFactory(service); + proxyFactory.addAdvice((MethodInterceptor) i -> { + adviceCalled.set(true); + return i.proceed(); + }); + service = (MyHandler) proxyFactory.getProxy(getClass().getClassLoader()); + + + GenericMessage testMessage = new GenericMessage<>("foo"); + + MethodInvokingMessageProcessor processor = new MethodInvokingMessageProcessor(service, "handle"); + + processor.processMessage(testMessage); + + assertEquals(testMessage.getPayload(), payloadReference.get()); + assertEquals(testMessage.getHeaders().getId(), idReference.get()); + assertTrue(adviceCalled.get()); + } + @Test public void testUseSpelInvoker() throws Exception { UseSpelInvokerBean bean = new UseSpelInvokerBean();