Commit 2d243f06 authored by Phillip Webb's avatar Phillip Webb

Don't apply multiple session configurations

Add additional @ConditionalOnMissingBean guards to session
configurations to ensure that the first wins. Also reorder imports
to prefer Redis over JDBC.

See gh-5158
parent 6466c0af
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
package org.springframework.boot.autoconfigure.session; package org.springframework.boot.autoconfigure.session;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
...@@ -33,6 +34,7 @@ import org.springframework.session.config.annotation.web.http.EnableSpringHttpSe ...@@ -33,6 +34,7 @@ import org.springframework.session.config.annotation.web.http.EnableSpringHttpSe
@Configuration @Configuration
@EnableSpringHttpSession @EnableSpringHttpSession
@Conditional(SessionCondition.class) @Conditional(SessionCondition.class)
@ConditionalOnMissingBean(SessionRepository.class)
class HashMapSessionConfiguration { class HashMapSessionConfiguration {
@Bean @Bean
......
...@@ -20,8 +20,10 @@ import com.hazelcast.core.HazelcastInstance; ...@@ -20,8 +20,10 @@ import com.hazelcast.core.HazelcastInstance;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.session.SessionRepository;
import org.springframework.session.hazelcast.config.annotation.web.http.HazelcastHttpSessionConfiguration; import org.springframework.session.hazelcast.config.annotation.web.http.HazelcastHttpSessionConfiguration;
/** /**
...@@ -32,6 +34,7 @@ import org.springframework.session.hazelcast.config.annotation.web.http.Hazelcas ...@@ -32,6 +34,7 @@ import org.springframework.session.hazelcast.config.annotation.web.http.Hazelcas
* @author Stephane Nicoll * @author Stephane Nicoll
*/ */
@Configuration @Configuration
@ConditionalOnMissingBean(SessionRepository.class)
@ConditionalOnBean(HazelcastInstance.class) @ConditionalOnBean(HazelcastInstance.class)
@Conditional(SessionCondition.class) @Conditional(SessionCondition.class)
class HazelcastSessionConfiguration { class HazelcastSessionConfiguration {
......
...@@ -20,8 +20,10 @@ import javax.sql.DataSource; ...@@ -20,8 +20,10 @@ import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.session.SessionRepository;
import org.springframework.session.jdbc.config.annotation.web.http.JdbcHttpSessionConfiguration; import org.springframework.session.jdbc.config.annotation.web.http.JdbcHttpSessionConfiguration;
/** /**
...@@ -31,6 +33,7 @@ import org.springframework.session.jdbc.config.annotation.web.http.JdbcHttpSessi ...@@ -31,6 +33,7 @@ import org.springframework.session.jdbc.config.annotation.web.http.JdbcHttpSessi
* @author Stephane Nicoll * @author Stephane Nicoll
*/ */
@Configuration @Configuration
@ConditionalOnMissingBean(SessionRepository.class)
@ConditionalOnBean(DataSource.class) @ConditionalOnBean(DataSource.class)
@Conditional(SessionCondition.class) @Conditional(SessionCondition.class)
class JdbcSessionConfiguration { class JdbcSessionConfiguration {
......
...@@ -18,9 +18,11 @@ package org.springframework.boot.autoconfigure.session; ...@@ -18,9 +18,11 @@ package org.springframework.boot.autoconfigure.session;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.session.SessionRepository;
import org.springframework.session.data.mongo.config.annotation.web.http.MongoHttpSessionConfiguration; import org.springframework.session.data.mongo.config.annotation.web.http.MongoHttpSessionConfiguration;
/** /**
...@@ -30,6 +32,7 @@ import org.springframework.session.data.mongo.config.annotation.web.http.MongoHt ...@@ -30,6 +32,7 @@ import org.springframework.session.data.mongo.config.annotation.web.http.MongoHt
* @author Stephane Nicoll * @author Stephane Nicoll
*/ */
@Configuration @Configuration
@ConditionalOnMissingBean(SessionRepository.class)
@ConditionalOnBean(MongoOperations.class) @ConditionalOnBean(MongoOperations.class)
@Conditional(SessionCondition.class) @Conditional(SessionCondition.class)
class MongoSessionConfiguration { class MongoSessionConfiguration {
......
...@@ -18,10 +18,12 @@ package org.springframework.boot.autoconfigure.session; ...@@ -18,10 +18,12 @@ package org.springframework.boot.autoconfigure.session;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.session.SessionRepository;
import org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration; import org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration;
/** /**
...@@ -33,6 +35,7 @@ import org.springframework.session.data.redis.config.annotation.web.http.RedisHt ...@@ -33,6 +35,7 @@ import org.springframework.session.data.redis.config.annotation.web.http.RedisHt
* @author Stephane Nicoll * @author Stephane Nicoll
*/ */
@Configuration @Configuration
@ConditionalOnMissingBean(SessionRepository.class)
@ConditionalOnBean({ RedisTemplate.class, RedisConnectionFactory.class }) @ConditionalOnBean({ RedisTemplate.class, RedisConnectionFactory.class })
@Conditional(SessionCondition.class) @Conditional(SessionCondition.class)
class RedisSessionConfiguration { class RedisSessionConfiguration {
......
...@@ -44,9 +44,9 @@ import org.springframework.session.SessionRepository; ...@@ -44,9 +44,9 @@ import org.springframework.session.SessionRepository;
* @since 1.4.0 * @since 1.4.0
*/ */
@Configuration @Configuration
@ConditionalOnMissingBean(SessionRepository.class)
@ConditionalOnClass(Session.class) @ConditionalOnClass(Session.class)
@ConditionalOnWebApplication @ConditionalOnWebApplication
@ConditionalOnMissingBean(SessionRepository.class)
@EnableConfigurationProperties(SessionProperties.class) @EnableConfigurationProperties(SessionProperties.class)
@AutoConfigureAfter({ DataSourceAutoConfiguration.class, HazelcastAutoConfiguration.class, @AutoConfigureAfter({ DataSourceAutoConfiguration.class, HazelcastAutoConfiguration.class,
MongoAutoConfiguration.class, RedisAutoConfiguration.class }) MongoAutoConfiguration.class, RedisAutoConfiguration.class })
......
...@@ -26,24 +26,24 @@ package org.springframework.boot.autoconfigure.session; ...@@ -26,24 +26,24 @@ package org.springframework.boot.autoconfigure.session;
public enum StoreType { public enum StoreType {
/** /**
* JDBC backed sessions. * Redis backed sessions.
*/ */
JDBC, REDIS,
/** /**
* Mongo backed sessions. * Hazelcast backed sessions.
*/ */
MONGO, HAZELCAST,
/** /**
* Redis backed sessions. * Mongo backed sessions.
*/ */
REDIS, MONGO,
/** /**
* Hazelcast backed sessions. * JDBC backed sessions.
*/ */
HAZELCAST, JDBC,
/** /**
* Simple in-memory map of sessions. * Simple in-memory map of sessions.
......
...@@ -56,6 +56,7 @@ public class SampleSessionRedisApplicationTests { ...@@ -56,6 +56,7 @@ public class SampleSessionRedisApplicationTests {
if (!redisServerRunning(ex)) { if (!redisServerRunning(ex)) {
return; return;
} }
throw ex;
} }
URI uri = URI.create("http://localhost:" + port + "/"); URI uri = URI.create("http://localhost:" + port + "/");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment