From b3ce079ea1455e50c5ced49e10954964150b18f5 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Tue, 26 Aug 2014 13:11:47 -0700 Subject: [PATCH] Automatically apply @EnableJMS Automatically apply @EnableJMS when spring-jms is on the classpath and the annotation hasn't already been applied. This allow for Spring's new @JmsListener annotation to just work. Fixes gh-1425 --- .../jms/JmsAnnotationDrivenConfiguration.java | 13 ++++++++++--- .../jms/JmsAutoConfigurationTests.java | 18 ++++++++++++++++-- 2 files changed, 26 insertions(+), 5 deletions(-) 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 3166af4390f..92cc4599f29 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 @@ -19,14 +19,15 @@ package org.springframework.boot.autoconfigure.jms; import javax.jms.ConnectionFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; import org.springframework.jms.annotation.EnableJms; -import org.springframework.jms.annotation.JmsListenerAnnotationBeanPostProcessor; +import org.springframework.jms.annotation.JmsBootstrapConfiguration; import org.springframework.jms.config.DefaultJmsListenerContainerFactory; +import org.springframework.jms.config.JmsListenerConfigUtils; import org.springframework.jms.support.destination.DestinationResolver; import org.springframework.transaction.PlatformTransactionManager; @@ -39,7 +40,7 @@ import org.springframework.transaction.PlatformTransactionManager; */ @Configuration @ConditionalOnClass(EnableJms.class) -@ConditionalOnBean(JmsListenerAnnotationBeanPostProcessor.class) +@Import(JmsBootstrapConfiguration.class) class JmsAnnotationDrivenConfiguration { @Autowired(required = false) @@ -63,4 +64,10 @@ class JmsAnnotationDrivenConfiguration { return factory; } + @EnableJms + @ConditionalOnMissingBean(name = JmsListenerConfigUtils.JMS_LISTENER_ANNOTATION_PROCESSOR_BEAN_NAME) + protected static class EnableJmsConfiguration { + + } + } 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 b0440ebbc87..c69d1d524fb 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 @@ -31,6 +31,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jms.annotation.EnableJms; import org.springframework.jms.config.DefaultJmsListenerContainerFactory; +import org.springframework.jms.config.JmsListenerConfigUtils; import org.springframework.jms.config.JmsListenerContainerFactory; import org.springframework.jms.config.SimpleJmsListenerContainerFactory; import org.springframework.jms.core.JmsMessagingTemplate; @@ -63,7 +64,7 @@ public class JmsAutoConfigurationTests { assertEquals(ActiveMQProperties.DEFAULT_EMBEDDED_BROKER_URL, ((ActiveMQConnectionFactory) jmsTemplate.getConnectionFactory()) .getBrokerURL()); - assertFalse("No listener container factory should be created by default", + assertTrue("listener container factory should be created by default", this.context.containsBean("jmsListenerContainerFactory")); } @@ -110,7 +111,6 @@ public class JmsAutoConfigurationTests { .getBean("jmsListenerContainerFactory", JmsListenerContainerFactory.class); assertEquals(DefaultJmsListenerContainerFactory.class, jmsListenerContainerFactory.getClass()); - } @Test @@ -223,6 +223,14 @@ public class JmsAutoConfigurationTests { assertEquals("tcp://remote-host:10000", factory.getBrokerURL()); } + @Test + public void enableJmsAutomatically() throws Exception { + load(NoEnableJmsConfiguration.class); + AnnotationConfigApplicationContext ctx = this.context; + ctx.getBean(JmsListenerConfigUtils.JMS_LISTENER_ANNOTATION_PROCESSOR_BEAN_NAME); + ctx.getBean(JmsListenerConfigUtils.JMS_LISTENER_ENDPOINT_REGISTRY_BEAN_NAME); + } + private AnnotationConfigApplicationContext createContext( Class... additionalClasses) { return doLoad(additionalClasses); @@ -291,6 +299,7 @@ public class JmsAutoConfigurationTests { @Configuration protected static class TestConfiguration5 { + @Bean JmsMessagingTemplate jmsMessagingTemplate(JmsTemplate jmsTemplate) { JmsMessagingTemplate messagingTemplate = new JmsMessagingTemplate(jmsTemplate); @@ -302,6 +311,7 @@ public class JmsAutoConfigurationTests { @Configuration protected static class TestConfiguration6 { + @Bean JmsListenerContainerFactory jmsListenerContainerFactory( ConnectionFactory connectionFactory) { @@ -317,4 +327,8 @@ public class JmsAutoConfigurationTests { protected static class EnableJmsConfiguration { } + @Configuration + protected static class NoEnableJmsConfiguration { + } + }