diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/config/AbstractMessageHandlerFactoryBean.java b/org.springframework.integration/src/main/java/org/springframework/integration/config/AbstractMessageHandlerFactoryBean.java index e755c7bb79..247be535ce 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/config/AbstractMessageHandlerFactoryBean.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/config/AbstractMessageHandlerFactoryBean.java @@ -16,6 +16,9 @@ package org.springframework.integration.config; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.BeanFactory; +import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.FactoryBean; import org.springframework.integration.core.MessageChannel; import org.springframework.integration.handler.AbstractReplyProducingMessageHandler; @@ -26,8 +29,9 @@ import org.springframework.util.Assert; * Base class for FactoryBeans that create MessageHandler instances. * * @author Mark Fisher + * @author Alexander Peters */ -public abstract class AbstractMessageHandlerFactoryBean implements FactoryBean { +public abstract class AbstractMessageHandlerFactoryBean implements FactoryBean, BeanFactoryAware { private volatile MessageHandler handler; @@ -41,6 +45,8 @@ public abstract class AbstractMessageHandlerFactoryBean implements FactoryBean { private final Object initializationMonitor = new Object(); + private BeanFactory beanFactory; + public void setTargetObject(Object targetObject) { this.targetObject = targetObject; @@ -53,14 +59,21 @@ public abstract class AbstractMessageHandlerFactoryBean implements FactoryBean { public void setOutputChannel(MessageChannel outputChannel) { this.outputChannel = outputChannel; } + + public void setBeanFactory(BeanFactory beanFactory) throws BeansException { + this.beanFactory = beanFactory; + } public Object getObject() throws Exception { if (this.handler == null) { this.initializeHandler(); Assert.notNull(this.handler, "failed to create MessageHandler"); - if (this.outputChannel != null - && this.handler instanceof AbstractReplyProducingMessageHandler) { - ((AbstractReplyProducingMessageHandler) this.handler).setOutputChannel(this.outputChannel); + if (this.handler instanceof AbstractReplyProducingMessageHandler) { + AbstractReplyProducingMessageHandler abstractHandler = (AbstractReplyProducingMessageHandler) this.handler; + if(this.outputChannel != null){ + abstractHandler.setOutputChannel(this.outputChannel); + } + abstractHandler.setBeanFactory(beanFactory); } } return this.handler; diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/splitter/SplitterIntegrationTests.java b/org.springframework.integration/src/test/java/org/springframework/integration/splitter/SplitterIntegrationTests.java index 31969c97e7..1bfec81e1d 100644 --- a/org.springframework.integration/src/test/java/org/springframework/integration/splitter/SplitterIntegrationTests.java +++ b/org.springframework.integration/src/test/java/org/springframework/integration/splitter/SplitterIntegrationTests.java @@ -30,13 +30,16 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.integration.annotation.MessageEndpoint; import org.springframework.integration.annotation.ServiceActivator; import org.springframework.integration.annotation.Splitter; +import org.springframework.integration.core.Message; import org.springframework.integration.core.MessageChannel; import org.springframework.integration.message.GenericMessage; +import org.springframework.integration.message.MessageBuilder; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * @author Iwein Fuld + * @author Alexander Peters */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration @@ -53,6 +56,9 @@ public class SplitterIntegrationTests { @Autowired @Qualifier("inDefault") MessageChannel inDefault; + + @Autowired + MethodInvokingSplitter splitter; private String sentence = "The quick brown fox jumped over the lazy dog"; @@ -107,5 +113,13 @@ public class SplitterIntegrationTests { assertTrue(receiver.receivedWords.containsAll(words)); assertTrue(words.containsAll(receiver.receivedWords)); } + + @Test + public void channelResolver_isNotNull() throws Exception { + splitter.setOutputChannel(null); + Message message = MessageBuilder.withPayload("fooBar") + .setReplyChannelName("out").build(); + inMethodInvoking.send(message); + } }