From 157a0d27520d79295fc6cc2d5a824d95a1fde6ac Mon Sep 17 00:00:00 2001 From: mdeinum Date: Fri, 23 Oct 2015 14:17:15 +0200 Subject: [PATCH] Autoconfigure MessageConverter for JMS classes This commit introduces automatic configuration of the `messageConverter` property for both the `JmsTemplate` and `DefaultJmsListenerContainerFactory`. When a `MessageConverter` is configured it will be used to configure both classes. Fixes: gh-4282 --- .../jms/JmsAnnotationDrivenConfiguration.java | 7 ++++ .../jms/JmsAutoConfiguration.java | 9 +++++ .../jms/JmsAutoConfigurationTests.java | 33 +++++++++++++++++++ 3 files changed, 49 insertions(+) diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/JmsAnnotationDrivenConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/JmsAnnotationDrivenConfiguration.java index c3ccd61f6e0c..a968e7ffe0b1 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/JmsAnnotationDrivenConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/JmsAnnotationDrivenConfiguration.java @@ -27,6 +27,7 @@ import org.springframework.jms.annotation.EnableJms; import org.springframework.jms.config.DefaultJmsListenerContainerFactory; import org.springframework.jms.config.JmsListenerConfigUtils; +import org.springframework.jms.support.converter.MessageConverter; import org.springframework.jms.support.destination.DestinationResolver; import org.springframework.jms.support.destination.JndiDestinationResolver; import org.springframework.transaction.jta.JtaTransactionManager; @@ -45,6 +46,9 @@ class JmsAnnotationDrivenConfiguration { @Autowired(required = false) private DestinationResolver destinationResolver; + @Autowired(required = false) + private MessageConverter messageConverter; + @Autowired(required = false) private JtaTransactionManager transactionManager; @@ -67,6 +71,9 @@ public DefaultJmsListenerContainerFactory jmsListenerContainerFactory( if (this.destinationResolver != null) { factory.setDestinationResolver(this.destinationResolver); } + if (this.messageConverter != null) { + factory.setMessageConverter(this.messageConverter); + } JmsProperties.Listener listener = this.properties.getListener(); factory.setAutoStartup(listener.isAutoStartup()); if (listener.getAcknowledgeMode() != null) { diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/JmsAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/JmsAutoConfiguration.java index d5b23854273c..55e5d7254ec6 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/JmsAutoConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/JmsAutoConfiguration.java @@ -29,6 +29,7 @@ import org.springframework.context.annotation.Import; import org.springframework.jms.core.JmsMessagingTemplate; import org.springframework.jms.core.JmsTemplate; +import org.springframework.jms.support.converter.MessageConverter; import org.springframework.jms.support.destination.DestinationResolver; /** @@ -53,6 +54,9 @@ public class JmsAutoConfiguration { @Autowired(required = false) private DestinationResolver destinationResolver; + @Autowired(required = false) + private MessageConverter messageConverter; + @Bean @ConditionalOnMissingBean public JmsTemplate jmsTemplate() { @@ -61,6 +65,11 @@ public JmsTemplate jmsTemplate() { if (this.destinationResolver != null) { jmsTemplate.setDestinationResolver(this.destinationResolver); } + + if (this.messageConverter != null) { + jmsTemplate.setMessageConverter(this.messageConverter); + } + return jmsTemplate; } diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jms/JmsAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jms/JmsAutoConfigurationTests.java index 27d1360a5f51..ac6f6cc4f035 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jms/JmsAutoConfigurationTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jms/JmsAutoConfigurationTests.java @@ -17,6 +17,8 @@ package org.springframework.boot.autoconfigure.jms; import javax.jms.ConnectionFactory; +import javax.jms.JMSException; +import javax.jms.Message; import javax.jms.Session; import org.apache.activemq.ActiveMQConnectionFactory; @@ -42,6 +44,8 @@ import org.springframework.jms.core.JmsMessagingTemplate; import org.springframework.jms.core.JmsTemplate; import org.springframework.jms.listener.DefaultMessageListenerContainer; +import org.springframework.jms.support.converter.MessageConversionException; +import org.springframework.jms.support.converter.MessageConverter; import org.springframework.transaction.jta.JtaTransactionManager; import static org.junit.Assert.assertEquals; @@ -330,6 +334,16 @@ public void enableJmsAutomatically() throws Exception { ctx.getBean(JmsListenerConfigUtils.JMS_LISTENER_ENDPOINT_REGISTRY_BEAN_NAME); } + @Test + public void testMessageConverterConfigured() { + load(TestConfigurationWithMessageConverter.class); + MessageConverter messageConverter = this.context.getBean(MessageConverter.class); + JmsTemplate jmsTemplate = this.context.getBean(JmsTemplate.class); + assertNotNull(messageConverter); + assertNotNull(jmsTemplate); + assertSame(messageConverter, jmsTemplate.getMessageConverter()); + } + private AnnotationConfigApplicationContext createContext( Class... additionalClasses) { return doLoad(additionalClasses); @@ -456,4 +470,23 @@ protected static class EnableJmsConfiguration { protected static class NoEnableJmsConfiguration { } + @Configuration + protected static class TestConfigurationWithMessageConverter { + + @Bean + public MessageConverter messageConverter() { + return new MessageConverter() { + @Override + public Message toMessage(Object o, Session session) throws JMSException, MessageConversionException { + return null; + } + + @Override + public Object fromMessage(Message message) throws JMSException, MessageConversionException { + return null; + } + }; + } + } + }