diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractChannelNameResolvingMessageRouter.java b/org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractChannelNameResolvingMessageRouter.java index f7977883b8..8015f1e71b 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractChannelNameResolvingMessageRouter.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/router/AbstractChannelNameResolvingMessageRouter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2009 the original author or authors. + * Copyright 2002-2010 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,9 +24,11 @@ import java.util.List; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.InitializingBean; +import org.springframework.core.convert.ConversionService; import org.springframework.integration.channel.BeanFactoryChannelResolver; import org.springframework.integration.channel.ChannelResolutionException; import org.springframework.integration.channel.ChannelResolver; +import org.springframework.integration.context.IntegrationContextUtils; import org.springframework.integration.core.Message; import org.springframework.integration.core.MessageChannel; import org.springframework.integration.core.MessagingException; @@ -44,6 +46,8 @@ public abstract class AbstractChannelNameResolvingMessageRouter extends Abstract private volatile ChannelResolver channelResolver; + private volatile ConversionService conversionService; + private volatile String prefix; private volatile String suffix; @@ -137,7 +141,16 @@ public abstract class AbstractChannelNameResolvingMessageRouter extends Abstract addToCollection(channels, (Collection) channelIndicator, message); } else { - throw new MessagingException("unsupported return type for router [" + channelIndicator.getClass() + "]"); + if (this.conversionService == null && this.beanFactory != null) { + this.conversionService = IntegrationContextUtils.getConversionService(this.beanFactory); + } + if (this.conversionService != null + && this.conversionService.canConvert(channelIndicator.getClass(), String.class)) { + addChannelFromString(channels, this.conversionService.convert(channelIndicator, String.class), message); + } + else { + throw new MessagingException("unsupported return type for router [" + channelIndicator.getClass() + "]"); + } } } } diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/router/config/HeaderValueRouterConvertibleTypeTests-context.xml b/org.springframework.integration/src/test/java/org/springframework/integration/router/config/HeaderValueRouterConvertibleTypeTests-context.xml new file mode 100644 index 0000000000..653451807c --- /dev/null +++ b/org.springframework.integration/src/test/java/org/springframework/integration/router/config/HeaderValueRouterConvertibleTypeTests-context.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/router/config/HeaderValueRouterConvertibleTypeTests.java b/org.springframework.integration/src/test/java/org/springframework/integration/router/config/HeaderValueRouterConvertibleTypeTests.java new file mode 100644 index 0000000000..69735cd54c --- /dev/null +++ b/org.springframework.integration/src/test/java/org/springframework/integration/router/config/HeaderValueRouterConvertibleTypeTests.java @@ -0,0 +1,66 @@ +/* + * Copyright 2002-2010 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.integration.router.config; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.integration.channel.PollableChannel; +import org.springframework.integration.core.Message; +import org.springframework.integration.core.MessageChannel; +import org.springframework.integration.message.MessageBuilder; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +/** + * @author Mark Fisher + */ +@ContextConfiguration +@RunWith(SpringJUnit4ClassRunner.class) +public class HeaderValueRouterConvertibleTypeTests { + + @Autowired + private MessageChannel inputChannel; + + @Autowired + private PollableChannel trueChannel; + + @Autowired + private PollableChannel falseChannel; + + + @Test + public void testBooleanValueMappingToChannels() { + Message trueMessage = MessageBuilder.withPayload(1) + .setHeader("testHeader", true).build(); + Message falseMessage = MessageBuilder.withPayload(0) + .setHeader("testHeader", false).build(); + inputChannel.send(trueMessage); + inputChannel.send(falseMessage); + Message trueResult = trueChannel.receive(); + assertNotNull(trueResult); + assertEquals(1, trueResult.getPayload()); + Message falseResult = falseChannel.receive(); + assertNotNull(falseResult); + assertEquals(0, falseResult.getPayload()); + } + +}