diff --git a/org.springframework.integration/src/main/java/org/springframework/integration/channel/AbstractMessageChannel.java b/org.springframework.integration/src/main/java/org/springframework/integration/channel/AbstractMessageChannel.java index 307076cccd..5078489c3b 100644 --- a/org.springframework.integration/src/main/java/org/springframework/integration/channel/AbstractMessageChannel.java +++ b/org.springframework.integration/src/main/java/org/springframework/integration/channel/AbstractMessageChannel.java @@ -124,8 +124,8 @@ public abstract class AbstractMessageChannel implements MessageChannel, BeanFact this.conversionService = this.beanFactory.getBean("conversionService", ConversionService.class); } else if (logger.isWarnEnabled()) { - logger.warn("Unable to attempt conversion of Message payload types. " + - "Datatype channel has no explicit ConversionService reference, " + + logger.warn("Unable to attempt conversion of Message payload types. Datatype channel '" + + this.getName() + "' has no explicit ConversionService reference, " + "and there is no 'conversionService' bean within the context."); } } diff --git a/org.springframework.integration/src/test/java/org/springframework/integration/channel/DatatypeChannelTests.java b/org.springframework.integration/src/test/java/org/springframework/integration/channel/DatatypeChannelTests.java index 7ce7d3f8ec..eb5e69c83e 100644 --- a/org.springframework.integration/src/test/java/org/springframework/integration/channel/DatatypeChannelTests.java +++ b/org.springframework.integration/src/test/java/org/springframework/integration/channel/DatatypeChannelTests.java @@ -16,13 +16,22 @@ package org.springframework.integration.channel; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; +import java.util.Collections; import java.util.Date; import org.junit.Test; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.context.support.ConversionServiceFactoryBean; +import org.springframework.context.support.GenericApplicationContext; +import org.springframework.core.convert.ConversionService; +import org.springframework.core.convert.converter.Converter; +import org.springframework.core.convert.support.ConversionServiceFactory; +import org.springframework.core.convert.support.GenericConversionService; import org.springframework.integration.core.MessageChannel; import org.springframework.integration.core.MessagingException; import org.springframework.integration.message.ErrorMessage; @@ -45,7 +54,84 @@ public class DatatypeChannelTests { @Test(expected = MessageDeliveryException.class) public void unsupportedTypeAndNoConversionService() { MessageChannel channel = createChannel(Integer.class); - channel.send(new StringMessage("test")); + channel.send(new StringMessage("123")); + } + + @Test + public void unsupportedTypeButConversionServiceSupports() { + QueueChannel channel = createChannel(Integer.class); + ConversionService conversionService = ConversionServiceFactory.createDefaultConversionService(); + channel.setConversionService(conversionService); + assertTrue(channel.send(new StringMessage("123"))); + } + + @Test(expected = MessageDeliveryException.class) + public void unsupportedTypeAndConversionServiceDoesNotSupport() { + QueueChannel channel = createChannel(Integer.class); + ConversionService conversionService = ConversionServiceFactory.createDefaultConversionService(); + channel.setConversionService(conversionService); + assertTrue(channel.send(new GenericMessage(Boolean.TRUE))); + } + + @Test + public void unsupportedTypeButCustomConversionServiceSupports() { + QueueChannel channel = createChannel(Integer.class); + GenericConversionService conversionService = ConversionServiceFactory.createDefaultConversionService(); + conversionService.addConverter(new Converter() { + public Integer convert(Boolean source) { + return source ? 1 : 0; + } + }); + channel.setConversionService(conversionService); + assertTrue(channel.send(new GenericMessage(Boolean.TRUE))); + assertEquals(new Integer(1), channel.receive().getPayload()); + } + + @Test + public void conversionServiceBeanUsedByDefault() { + GenericApplicationContext context = new GenericApplicationContext(); + Converter converter = new Converter() { + public Integer convert(Boolean source) { + return source ? 1 : 0; + } + }; + BeanDefinitionBuilder conversionServiceBuilder = + BeanDefinitionBuilder.genericBeanDefinition(ConversionServiceFactoryBean.class); + conversionServiceBuilder.addPropertyValue("converters", Collections.singleton(converter)); + context.registerBeanDefinition("conversionService", conversionServiceBuilder.getBeanDefinition()); + BeanDefinitionBuilder channelBuilder = BeanDefinitionBuilder.genericBeanDefinition(QueueChannel.class); + channelBuilder.addPropertyValue("datatypes", "java.lang.Integer, java.util.Date"); + context.registerBeanDefinition("testChannel", channelBuilder.getBeanDefinition()); + QueueChannel channel = context.getBean("testChannel", QueueChannel.class); + assertTrue(channel.send(new GenericMessage(Boolean.TRUE))); + assertEquals(new Integer(1), channel.receive().getPayload()); + } + + @Test + public void conversionServiceReferenceOverridesDefault() { + GenericApplicationContext context = new GenericApplicationContext(); + Converter defaultConverter = new Converter() { + public Integer convert(Boolean source) { + return source ? 1 : 0; + } + }; + GenericConversionService customConversionService = ConversionServiceFactory.createDefaultConversionService(); + customConversionService.addConverter(new Converter() { + public Integer convert(Boolean source) { + return source ? 99 : -99; + } + }); + BeanDefinitionBuilder conversionServiceBuilder = + BeanDefinitionBuilder.genericBeanDefinition(ConversionServiceFactoryBean.class); + conversionServiceBuilder.addPropertyValue("converters", Collections.singleton(defaultConverter)); + context.registerBeanDefinition("conversionService", conversionServiceBuilder.getBeanDefinition()); + BeanDefinitionBuilder channelBuilder = BeanDefinitionBuilder.genericBeanDefinition(QueueChannel.class); + channelBuilder.addPropertyValue("datatypes", "java.lang.Integer, java.util.Date"); + channelBuilder.addPropertyValue("conversionService", customConversionService); + context.registerBeanDefinition("testChannel", channelBuilder.getBeanDefinition()); + QueueChannel channel = context.getBean("testChannel", QueueChannel.class); + assertTrue(channel.send(new GenericMessage(Boolean.TRUE))); + assertEquals(new Integer(99), channel.receive().getPayload()); } @Test