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
This commit is contained in:
Phillip Webb 2016-05-02 16:40:58 -07:00
parent 6466c0afa5
commit 2d243f0668
8 changed files with 26 additions and 11 deletions

View File

@ -16,6 +16,7 @@
package org.springframework.boot.autoconfigure.session;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
@ -33,6 +34,7 @@ import org.springframework.session.config.annotation.web.http.EnableSpringHttpSe
@Configuration
@EnableSpringHttpSession
@Conditional(SessionCondition.class)
@ConditionalOnMissingBean(SessionRepository.class)
class HashMapSessionConfiguration {
@Bean

View File

@ -20,8 +20,10 @@ import com.hazelcast.core.HazelcastInstance;
import org.springframework.beans.factory.annotation.Autowired;
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.Configuration;
import org.springframework.session.SessionRepository;
import org.springframework.session.hazelcast.config.annotation.web.http.HazelcastHttpSessionConfiguration;
/**
@ -32,6 +34,7 @@ import org.springframework.session.hazelcast.config.annotation.web.http.Hazelcas
* @author Stephane Nicoll
*/
@Configuration
@ConditionalOnMissingBean(SessionRepository.class)
@ConditionalOnBean(HazelcastInstance.class)
@Conditional(SessionCondition.class)
class HazelcastSessionConfiguration {

View File

@ -20,8 +20,10 @@ import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
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.Configuration;
import org.springframework.session.SessionRepository;
import org.springframework.session.jdbc.config.annotation.web.http.JdbcHttpSessionConfiguration;
/**
@ -31,6 +33,7 @@ import org.springframework.session.jdbc.config.annotation.web.http.JdbcHttpSessi
* @author Stephane Nicoll
*/
@Configuration
@ConditionalOnMissingBean(SessionRepository.class)
@ConditionalOnBean(DataSource.class)
@Conditional(SessionCondition.class)
class JdbcSessionConfiguration {

View File

@ -18,9 +18,11 @@ package org.springframework.boot.autoconfigure.session;
import org.springframework.beans.factory.annotation.Autowired;
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.Configuration;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.session.SessionRepository;
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
* @author Stephane Nicoll
*/
@Configuration
@ConditionalOnMissingBean(SessionRepository.class)
@ConditionalOnBean(MongoOperations.class)
@Conditional(SessionCondition.class)
class MongoSessionConfiguration {

View File

@ -18,10 +18,12 @@ package org.springframework.boot.autoconfigure.session;
import org.springframework.beans.factory.annotation.Autowired;
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.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.session.SessionRepository;
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
* @author Stephane Nicoll
*/
@Configuration
@ConditionalOnMissingBean(SessionRepository.class)
@ConditionalOnBean({ RedisTemplate.class, RedisConnectionFactory.class })
@Conditional(SessionCondition.class)
class RedisSessionConfiguration {

View File

@ -44,9 +44,9 @@ import org.springframework.session.SessionRepository;
* @since 1.4.0
*/
@Configuration
@ConditionalOnMissingBean(SessionRepository.class)
@ConditionalOnClass(Session.class)
@ConditionalOnWebApplication
@ConditionalOnMissingBean(SessionRepository.class)
@EnableConfigurationProperties(SessionProperties.class)
@AutoConfigureAfter({ DataSourceAutoConfiguration.class, HazelcastAutoConfiguration.class,
MongoAutoConfiguration.class, RedisAutoConfiguration.class })

View File

@ -25,16 +25,6 @@ package org.springframework.boot.autoconfigure.session;
*/
public enum StoreType {
/**
* JDBC backed sessions.
*/
JDBC,
/**
* Mongo backed sessions.
*/
MONGO,
/**
* Redis backed sessions.
*/
@ -45,6 +35,16 @@ public enum StoreType {
*/
HAZELCAST,
/**
* Mongo backed sessions.
*/
MONGO,
/**
* JDBC backed sessions.
*/
JDBC,
/**
* Simple in-memory map of sessions.
*/

View File

@ -56,6 +56,7 @@ public class SampleSessionRedisApplicationTests {
if (!redisServerRunning(ex)) {
return;
}
throw ex;
}
URI uri = URI.create("http://localhost:" + port + "/");