From 3e291ff04f571fea44f37e3faa6e11d2f7654a3f Mon Sep 17 00:00:00 2001 From: Vladimir Tsanev Date: Thu, 7 Jan 2016 13:58:39 +0200 Subject: [PATCH] Allow DevTools to find and configure Spring Session 1.1's RedisTemplate Previously, when Spring Session 1.1.0.M1 and DevTools were declared as dependencies the application failed to start, because sessionRedisTemplate could not be resolved. This commit relaxes the dependency for sessionRedisTemplate in restartCompatibleRedisSerializerConfigurer from RedisTemplate to RedisTemplate and uses the bean name in a @Qualifer to ensure that the right RedisTemplate bean gets injected. Fixes gh-4895 Closes gh-4896 --- .../LocalDevToolsAutoConfiguration.java | 4 +-- ...rtCompatibleRedisSerializerConfigurer.java | 6 ++-- .../LocalDevToolsAutoConfigurationTests.java | 35 +++++++++++++++---- 3 files changed, 33 insertions(+), 12 deletions(-) diff --git a/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/autoconfigure/LocalDevToolsAutoConfiguration.java b/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/autoconfigure/LocalDevToolsAutoConfiguration.java index e4e156742fc..389f07abdce 100644 --- a/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/autoconfigure/LocalDevToolsAutoConfiguration.java +++ b/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/autoconfigure/LocalDevToolsAutoConfiguration.java @@ -21,6 +21,7 @@ import java.net.URL; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -42,7 +43,6 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.context.event.EventListener; import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.session.ExpiringSession; import org.springframework.util.StringUtils; /** @@ -169,7 +169,7 @@ public class LocalDevToolsAutoConfiguration { @Bean public RestartCompatibleRedisSerializerConfigurer restartCompatibleRedisSerializerConfigurer( - RedisTemplate sessionRedisTemplate) { + @Qualifier("sessionRedisTemplate") RedisTemplate sessionRedisTemplate) { return new RestartCompatibleRedisSerializerConfigurer( sessionRedisTemplate); } diff --git a/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/autoconfigure/RestartCompatibleRedisSerializerConfigurer.java b/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/autoconfigure/RestartCompatibleRedisSerializerConfigurer.java index c45172f7b16..a93e5e795d2 100644 --- a/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/autoconfigure/RestartCompatibleRedisSerializerConfigurer.java +++ b/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/autoconfigure/RestartCompatibleRedisSerializerConfigurer.java @@ -26,7 +26,6 @@ import org.springframework.core.serializer.support.SerializingConverter; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.SerializationException; -import org.springframework.session.ExpiringSession; import org.springframework.util.ObjectUtils; /** @@ -42,12 +41,11 @@ import org.springframework.util.ObjectUtils; */ class RestartCompatibleRedisSerializerConfigurer implements BeanClassLoaderAware { - private final RedisTemplate redisTemplate; + private final RedisTemplate redisTemplate; private volatile ClassLoader classLoader; - RestartCompatibleRedisSerializerConfigurer( - RedisTemplate redisTemplate) { + RestartCompatibleRedisSerializerConfigurer(RedisTemplate redisTemplate) { this.redisTemplate = redisTemplate; } diff --git a/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/autoconfigure/LocalDevToolsAutoConfigurationTests.java b/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/autoconfigure/LocalDevToolsAutoConfigurationTests.java index f3b5a1ee8bf..c9472c6ec7d 100755 --- a/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/autoconfigure/LocalDevToolsAutoConfigurationTests.java +++ b/spring-boot-devtools/src/test/java/org/springframework/boot/devtools/autoconfigure/LocalDevToolsAutoConfigurationTests.java @@ -241,13 +241,27 @@ public class LocalDevToolsAutoConfigurationTests { } @Test - public void sessionRedisTemplateIsConfiguredWithCustomDeserializers() + public void sessionRedisTemplateIsConfiguredWithCustomDeserializers10() throws Exception { - SpringApplication application = new SpringApplication( - SessionRedisTemplateConfig.class, LocalDevToolsAutoConfiguration.class); + sessionRedisTemplateIsConfiguredWithCustomDeserializers( + SessionRedisTemplateConfig10.class); + } + + @Test + public void sessionRedisTemplateIsConfiguredWithCustomDeserializers11() + throws Exception { + sessionRedisTemplateIsConfiguredWithCustomDeserializers( + SessionRedisTemplateConfig11.class); + } + + private void sessionRedisTemplateIsConfiguredWithCustomDeserializers( + Object sessionConfig) throws Exception { + SpringApplication application = new SpringApplication(sessionConfig, + LocalDevToolsAutoConfiguration.class); application.setWebEnvironment(false); this.context = application.run(); - RedisTemplate redisTemplate = this.context.getBean(RedisTemplate.class); + RedisTemplate redisTemplate = this.context.getBean("sessionRedisTemplate", + RedisTemplate.class); assertThat(redisTemplate.getHashKeySerializer(), is(instanceOf(RestartCompatibleRedisSerializer.class))); assertThat(redisTemplate.getHashValueSerializer(), @@ -306,7 +320,7 @@ public class LocalDevToolsAutoConfigurationTests { } @Configuration - public static class SessionRedisTemplateConfig { + public static class SessionRedisTemplateConfig10 { @Bean public RedisTemplate sessionRedisTemplate() { @@ -314,7 +328,16 @@ public class LocalDevToolsAutoConfigurationTests { redisTemplate.setConnectionFactory(mock(RedisConnectionFactory.class)); return redisTemplate; } - } + @Configuration + public static class SessionRedisTemplateConfig11 { + + @Bean + public RedisTemplate sessionRedisTemplate() { + RedisTemplate redisTemplate = new RedisTemplate(); + redisTemplate.setConnectionFactory(mock(RedisConnectionFactory.class)); + return redisTemplate; + } + } }