diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/RouterFactoryBean.java b/spring-integration-core/src/main/java/org/springframework/integration/config/RouterFactoryBean.java index 99c2abfaae..9da9f5f697 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/RouterFactoryBean.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/RouterFactoryBean.java @@ -15,12 +15,16 @@ package org.springframework.integration.config; import java.util.Map; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + import org.springframework.expression.Expression; import org.springframework.integration.MessageChannel; import org.springframework.integration.core.MessageHandler; import org.springframework.integration.router.AbstractMappingMessageRouter; import org.springframework.integration.router.ExpressionEvaluatingRouter; import org.springframework.integration.router.MethodInvokingRouter; +import org.springframework.integration.support.channel.ChannelResolver; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -33,6 +37,8 @@ import org.springframework.util.StringUtils; * @author Dave Syer */ public class RouterFactoryBean extends AbstractStandardMessageHandlerFactoryBean { + + private final Log logger = LogFactory.getLog(this.getClass()); private volatile Map channelMappings; @@ -45,8 +51,14 @@ public class RouterFactoryBean extends AbstractStandardMessageHandlerFactoryBean private volatile Boolean applySequence; private volatile Boolean ignoreSendFailures; + + private volatile ChannelResolver channelResolver; + public void setChannelResolver(ChannelResolver channelResolver) { + this.channelResolver = channelResolver; + } + public void setDefaultOutputChannel(MessageChannel defaultOutputChannel) { this.defaultOutputChannel = defaultOutputChannel; } @@ -75,6 +87,10 @@ public class RouterFactoryBean extends AbstractStandardMessageHandlerFactoryBean MessageHandler createMethodInvokingHandler(Object targetObject, String targetMethodName) { Assert.notNull(targetObject, "target object must not be null"); AbstractMappingMessageRouter router = this.extractTypeIfPossible(targetObject, AbstractMappingMessageRouter.class); + if (this.channelResolver != null){ + logger.warn("'channel-resolver' attribute has been deprecated in favor of using SpEL via 'expression' attribute"); + router.setChannelResolver(this.channelResolver); + } if (router == null) { router = this.createMethodInvokingRouter(targetObject, targetMethodName); this.configureRouter(router); diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AbstractRouterParser.java b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AbstractRouterParser.java index 2923617092..f105dbe78c 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AbstractRouterParser.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/AbstractRouterParser.java @@ -43,6 +43,7 @@ public abstract class AbstractRouterParser extends AbstractConsumerEndpointParse IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "resolution-required"); IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "apply-sequence"); IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "ignore-send-failures"); + IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "channel-resolver"); BeanDefinition targetRouterBeanDefinition = this.parseRouter(element, parserContext); builder.addPropertyValue("targetObject", targetRouterBeanDefinition); return builder; diff --git a/spring-integration-core/src/main/java/org/springframework/integration/router/AbstractMappingMessageRouter.java b/spring-integration-core/src/main/java/org/springframework/integration/router/AbstractMappingMessageRouter.java index 69229406fa..3aa4da1e86 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/router/AbstractMappingMessageRouter.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/router/AbstractMappingMessageRouter.java @@ -68,9 +68,12 @@ public abstract class AbstractMappingMessageRouter extends AbstractMessageRouter } /** + * @deprecated - since 2.1 in favor of using SpEL via 'expression' attribute + * * Specify the {@link ChannelResolver} strategy to use. * The default is a BeanFactoryChannelResolver. */ + @Deprecated public void setChannelResolver(ChannelResolver channelResolver) { Assert.notNull(channelResolver, "'channelResolver' must not be null"); this.channelResolver = channelResolver; diff --git a/spring-integration-core/src/main/resources/org/springframework/integration/config/xml/spring-integration-2.1.xsd b/spring-integration-core/src/main/resources/org/springframework/integration/config/xml/spring-integration-2.1.xsd index eef12d7d03..1610a4e171 100644 --- a/spring-integration-core/src/main/resources/org/springframework/integration/config/xml/spring-integration-2.1.xsd +++ b/spring-integration-core/src/main/resources/org/springframework/integration/config/xml/spring-integration-2.1.xsd @@ -2869,6 +2869,20 @@ endpoint itself is a Polling Consumer for a channel with a queue. + + + + + + + + + + - + @@ -32,4 +32,5 @@ service-interface="org.springframework.integration.router.config.PayloadTypeRouterParserTests$TestService" default-request-channel="routingChannel" /> + diff --git a/spring-integration-core/src/test/java/org/springframework/integration/router/config/PayloadTypeRouterParserTests.java b/spring-integration-core/src/test/java/org/springframework/integration/router/config/PayloadTypeRouterParserTests.java index ab2da2c1a2..5cb8ab5c0d 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/router/config/PayloadTypeRouterParserTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/router/config/PayloadTypeRouterParserTests.java @@ -16,8 +16,6 @@ package org.springframework.integration.router.config; -import static org.junit.Assert.assertTrue; - import java.io.ByteArrayInputStream; import org.junit.Test; @@ -31,10 +29,16 @@ import org.springframework.context.support.GenericApplicationContext; import org.springframework.core.io.InputStreamResource; import org.springframework.integration.Message; import org.springframework.integration.core.PollableChannel; +import org.springframework.integration.endpoint.EventDrivenConsumer; import org.springframework.integration.support.MessageBuilder; +import org.springframework.integration.support.channel.BeanFactoryChannelResolver; +import org.springframework.integration.test.util.TestUtils; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + /** * @author Oleg Zhurakousky */ @@ -67,6 +71,9 @@ public class PayloadTypeRouterParserTests { assertTrue(chanel2.receive(100).getPayload() instanceof Integer); assertTrue(chanel3.receive(100).getPayload().getClass().isArray()); assertTrue(chanel4.receive(100).getPayload().getClass().isArray()); + + EventDrivenConsumer edc = context.getBean("routerWithChannelResolver", EventDrivenConsumer.class); + assertEquals(context.getBean("cr"), TestUtils.getPropertyValue(edc, "handler.channelResolver")); } @Test(expected=BeanDefinitionStoreException.class) @@ -110,4 +117,5 @@ public class PayloadTypeRouterParserTests { public void foo(Message message); } + public static class MyChannelResolver extends BeanFactoryChannelResolver{} } diff --git a/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XPathRouterParserTests.java b/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XPathRouterParserTests.java index 7096faef01..b534c8b515 100644 --- a/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XPathRouterParserTests.java +++ b/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XPathRouterParserTests.java @@ -39,6 +39,7 @@ import org.springframework.integration.endpoint.EventDrivenConsumer; import org.springframework.integration.message.GenericMessage; import org.springframework.integration.router.AbstractMappingMessageRouter; import org.springframework.integration.support.MessageBuilder; +import org.springframework.integration.support.channel.BeanFactoryChannelResolver; import org.springframework.integration.test.util.TestUtils; import org.springframework.integration.xml.DefaultXmlPayloadConverter; import org.springframework.integration.xml.util.XmlTestUtil; @@ -265,5 +266,7 @@ public class XPathRouterParserTests { return super.convertToDocument(object); } } + + public static class MyChannelResolver extends BeanFactoryChannelResolver{} } diff --git a/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XPathRouterTests-context.xml b/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XPathRouterTests-context.xml index 3d10a5b118..f49ebf4593 100644 --- a/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XPathRouterTests-context.xml +++ b/spring-integration-xml/src/test/java/org/springframework/integration/xml/config/XPathRouterTests-context.xml @@ -26,7 +26,9 @@ - + @@ -44,4 +46,5 @@ +