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 @@
+
+