From 224eef3149f3243e53db24b2277a89bb7a929bf5 Mon Sep 17 00:00:00 2001 From: Gary Russell Date: Thu, 20 Nov 2014 20:26:33 +0200 Subject: [PATCH] INT-3565 ClassCastException with Proxy and DEBUG JIRA: https://jira.spring.io/browse/INT-3565 Cast to `IntegrationObjectSupport` fails if the handler is already proxied in `AbstractSimpleMessageHandlerFactoryBean`. INT-3565 Polishing - Fix test. - enhance test to show that directly bound message handler beans are not advised if already proxied. --- ...stractSimpleMessageHandlerFactoryBean.java | 44 +++++-- .../transformer/TransformerContextTests.java | 2 + .../monitor/TransformerContextTests.java | 107 ++++++++++++++++++ .../monitor/transformerContextTests.xml | 53 +++++++++ 4 files changed, 197 insertions(+), 9 deletions(-) create mode 100644 spring-integration-jmx/src/test/java/org/springframework/integration/monitor/TransformerContextTests.java create mode 100644 spring-integration-jmx/src/test/java/org/springframework/integration/monitor/transformerContextTests.xml diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/AbstractSimpleMessageHandlerFactoryBean.java b/spring-integration-core/src/main/java/org/springframework/integration/config/AbstractSimpleMessageHandlerFactoryBean.java index 014813ce1e..922b565869 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/AbstractSimpleMessageHandlerFactoryBean.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/AbstractSimpleMessageHandlerFactoryBean.java @@ -19,6 +19,7 @@ import org.aopalliance.aop.Advice; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.aop.framework.Advised; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; @@ -29,6 +30,7 @@ import org.springframework.integration.context.IntegrationObjectSupport; import org.springframework.integration.context.Orderable; import org.springframework.integration.core.MessageProducer; import org.springframework.integration.handler.AbstractReplyProducingMessageHandler; +import org.springframework.integration.support.context.NamedComponent; import org.springframework.messaging.MessageChannel; import org.springframework.messaging.MessageHandler; import org.springframework.util.Assert; @@ -118,17 +120,24 @@ public abstract class AbstractSimpleMessageHandlerFactoryBean("foo")); + Message reply = output.receive(0); + assertEquals("FOO", reply.getPayload()); + assertEquals(1, adviceCalled); + + input = context.getBean("direct", MessageChannel.class); + input.send(new GenericMessage("foo")); + reply = output.receive(0); + assertEquals("FOO", reply.getPayload()); + + input = context.getBean("directRef", MessageChannel.class); + input.send(new GenericMessage("foo")); + reply = output.receive(0); + assertEquals("FOO", reply.getPayload()); + assertEquals(2, adviceCalled); + + input = context.getBean("service", MessageChannel.class); + input.send(new GenericMessage("foo")); + assertEquals(1, bazCalled); + assertEquals(3, adviceCalled); + + context.close(); + } + + public static class FooAdvice extends AbstractRequestHandlerAdvice { + + @Override + protected Object doInvoke(ExecutionCallback callback, Object target, Message message) throws Exception { + adviceCalled++; + return callback.execute(); + } + + } + + public static class Bar extends AbstractReplyProducingMessageHandler { + + @Override + protected Object handleRequestMessage(Message requestMessage) { + Exception e = new RuntimeException(); + StackTraceElement[] st = e.getStackTrace(); + return MessageBuilder.withPayload(requestMessage.getPayload().toString().toUpperCase()) + .setHeader("callStack", st); + } + + } + + public static class BazService { + + public void qux() { + bazCalled++; + } + + public String upperCase(String input) { + return input.toUpperCase(); + } + + } + +} diff --git a/spring-integration-jmx/src/test/java/org/springframework/integration/monitor/transformerContextTests.xml b/spring-integration-jmx/src/test/java/org/springframework/integration/monitor/transformerContextTests.xml new file mode 100644 index 0000000000..0498f75b3a --- /dev/null +++ b/spring-integration-jmx/src/test/java/org/springframework/integration/monitor/transformerContextTests.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +