diff --git a/spring-integration-jms/src/main/java/org/springframework/integration/jms/AbstractJmsTemplateBasedAdapter.java b/spring-integration-jms/src/main/java/org/springframework/integration/jms/AbstractJmsTemplateBasedAdapter.java index 0498836815..4026c71b32 100644 --- a/spring-integration-jms/src/main/java/org/springframework/integration/jms/AbstractJmsTemplateBasedAdapter.java +++ b/spring-integration-jms/src/main/java/org/springframework/integration/jms/AbstractJmsTemplateBasedAdapter.java @@ -22,6 +22,8 @@ import javax.jms.Destination; import org.springframework.beans.factory.InitializingBean; import org.springframework.jms.core.JmsTemplate; +import org.springframework.jms.support.converter.MessageConverter; +import org.springframework.jms.support.converter.SimpleMessageConverter; import org.springframework.jms.support.destination.DestinationResolver; import org.springframework.util.Assert; @@ -52,6 +54,8 @@ public abstract class AbstractJmsTemplateBasedAdapter implements InitializingBea private volatile JmsTemplate jmsTemplate; + private volatile MessageConverter messageConverter; + private volatile JmsHeaderMapper headerMapper; private volatile boolean initialized; @@ -97,12 +101,19 @@ public abstract class AbstractJmsTemplateBasedAdapter implements InitializingBea this.pubSubDomain = pubSubDomain; } - public void setDestinationResolver(DestinationResolver destinationResolver) { - this.destinationResolver = destinationResolver; + /** + * Provide a {@link MessageConverter} strategy to use for converting + * between Spring Integration Messages and JMS Messages. + *

+ * The default is a {@link HeaderMappingMessageConverter} that delegates to + * a {@link SimpleMessageConverter}. + */ + public void setMessageConverter(MessageConverter messageConverter) { + this.messageConverter = messageConverter; } - public void setJmsTemplate(JmsTemplate jmsTemplate) { - this.jmsTemplate = jmsTemplate; + public void setDestinationResolver(DestinationResolver destinationResolver) { + this.destinationResolver = destinationResolver; } public void setHeaderMapper(JmsHeaderMapper headerMapper) { @@ -168,6 +179,9 @@ public abstract class AbstractJmsTemplateBasedAdapter implements InitializingBea this.jmsTemplate.setTimeToLive(this.timeToLive); this.jmsTemplate.setPriority(this.priority); this.jmsTemplate.setDeliveryMode(this.deliveryMode); + if (this.messageConverter != null) { + this.jmsTemplate.setMessageConverter(this.messageConverter); + } this.configureMessageConverter(this.jmsTemplate, this.headerMapper); this.initialized = true; } diff --git a/spring-integration-jms/src/main/java/org/springframework/integration/jms/JmsDestinationPollingSource.java b/spring-integration-jms/src/main/java/org/springframework/integration/jms/JmsDestinationPollingSource.java index bf8156d8ca..242795e416 100644 --- a/spring-integration-jms/src/main/java/org/springframework/integration/jms/JmsDestinationPollingSource.java +++ b/spring-integration-jms/src/main/java/org/springframework/integration/jms/JmsDestinationPollingSource.java @@ -60,15 +60,6 @@ public class JmsDestinationPollingSource extends AbstractJmsTemplateBasedAdapter this.messageSelector = messageSelector; } - /** - * Specify a MessageConverter to use when mapping from JMS Mesages to - * Spring Integration Messages. If it is not itself an implementation - * of {@link HeaderMappingMessageConverter}, it will be wrapped. - */ - public void setMessageConverter(MessageConverter messageConverter) { - this.getJmsTemplate().setMessageConverter(messageConverter); - } - /** * Specify whether the payload should be extracted from each received JMS * Message to be used as the Spring Integration Message payload. diff --git a/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsOutboundChannelAdapterParser.java b/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsOutboundChannelAdapterParser.java index f50c65565b..2ad29ffd3e 100644 --- a/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsOutboundChannelAdapterParser.java +++ b/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsOutboundChannelAdapterParser.java @@ -70,6 +70,7 @@ public class JmsOutboundChannelAdapterParser extends AbstractOutboundChannelAdap if (StringUtils.hasText(headerMapper)) { builder.addPropertyReference(JmsAdapterParserUtils.HEADER_MAPPER_PROPERTY, headerMapper); } + IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "message-converter"); IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "extract-payload"); IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "time-to-live"); IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "priority"); diff --git a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsOutboundChannelAdapterParserTests.java b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsOutboundChannelAdapterParserTests.java index c805b47661..b9b142d0e2 100644 --- a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsOutboundChannelAdapterParserTests.java +++ b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsOutboundChannelAdapterParserTests.java @@ -29,6 +29,7 @@ import org.springframework.beans.factory.BeanDefinitionStoreException; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.integration.endpoint.EventDrivenConsumer; import org.springframework.integration.jms.JmsHeaderMapper; +import org.springframework.jms.support.converter.MessageConverter; /** * @author Mark Fisher @@ -88,6 +89,17 @@ public class JmsOutboundChannelAdapterParserTests { assertEquals(TestJmsHeaderMapper.class, headerMapper.getClass()); } + @Test + public void adapterWithMessageConverter() { + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( + "jmsOutboundWithMessageConverter.xml", this.getClass()); + EventDrivenConsumer endpoint = (EventDrivenConsumer) context.getBean("adapter"); + DirectFieldAccessor handlerAccessor = new DirectFieldAccessor(new DirectFieldAccessor(endpoint).getPropertyValue("handler")); + MessageConverter messageConverter = (MessageConverter) handlerAccessor.getPropertyValue("messageConverter"); + assertNotNull(messageConverter); + assertEquals(TestMessageConverter.class, messageConverter.getClass()); + } + @Test(expected = BeanDefinitionStoreException.class) public void adapterWithEmptyConnectionFactory() { try { diff --git a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsOutboundWithMessageConverter.xml b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsOutboundWithMessageConverter.xml new file mode 100644 index 0000000000..f3b8f103db --- /dev/null +++ b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/jmsOutboundWithMessageConverter.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + +