Skip to content

Commit 7b1d07f

Browse files
committed
Use SpringSessionDataSource-annotated DataSource when one is available
Fixes gh-24624
1 parent 22ff229 commit 7b1d07f

File tree

2 files changed

+54
-5
lines changed

2 files changed

+54
-5
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/JdbcSessionConfiguration.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2020 the original author or authors.
2+
* Copyright 2012-2021 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -20,6 +20,7 @@
2020

2121
import javax.sql.DataSource;
2222

23+
import org.springframework.beans.factory.ObjectProvider;
2324
import org.springframework.beans.factory.annotation.Autowired;
2425
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
2526
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
@@ -32,6 +33,7 @@
3233
import org.springframework.jdbc.core.JdbcTemplate;
3334
import org.springframework.session.SessionRepository;
3435
import org.springframework.session.jdbc.JdbcIndexedSessionRepository;
36+
import org.springframework.session.jdbc.config.annotation.SpringSessionDataSource;
3537
import org.springframework.session.jdbc.config.annotation.web.http.JdbcHttpSessionConfiguration;
3638

3739
/**
@@ -51,9 +53,11 @@ class JdbcSessionConfiguration {
5153

5254
@Bean
5355
@ConditionalOnMissingBean
54-
JdbcSessionDataSourceInitializer jdbcSessionDataSourceInitializer(DataSource dataSource,
55-
ResourceLoader resourceLoader, JdbcSessionProperties properties) {
56-
return new JdbcSessionDataSourceInitializer(dataSource, resourceLoader, properties);
56+
JdbcSessionDataSourceInitializer jdbcSessionDataSourceInitializer(
57+
@SpringSessionDataSource ObjectProvider<DataSource> sessionDataSource,
58+
ObjectProvider<DataSource> dataSource, ResourceLoader resourceLoader, JdbcSessionProperties properties) {
59+
return new JdbcSessionDataSourceInitializer(sessionDataSource.getIfAvailable(dataSource::getObject),
60+
resourceLoader, properties);
5761
}
5862

5963
@Configuration(proxyBeanMethods = false)

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationJdbcTests.java

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2019 the original author or authors.
2+
* Copyright 2012-2021 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -16,6 +16,9 @@
1616

1717
package org.springframework.boot.autoconfigure.session;
1818

19+
import javax.sql.DataSource;
20+
21+
import org.apache.commons.dbcp2.BasicDataSource;
1922
import org.junit.jupiter.api.Test;
2023

2124
import org.springframework.boot.autoconfigure.AutoConfigurations;
@@ -28,6 +31,9 @@
2831
import org.springframework.boot.test.context.assertj.AssertableWebApplicationContext;
2932
import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
3033
import org.springframework.boot.web.servlet.FilterRegistrationBean;
34+
import org.springframework.context.annotation.Bean;
35+
import org.springframework.context.annotation.Configuration;
36+
import org.springframework.context.annotation.Primary;
3137
import org.springframework.jdbc.BadSqlGrammarException;
3238
import org.springframework.jdbc.core.JdbcOperations;
3339
import org.springframework.session.FlushMode;
@@ -36,6 +42,7 @@
3642
import org.springframework.session.data.redis.RedisIndexedSessionRepository;
3743
import org.springframework.session.hazelcast.HazelcastIndexedSessionRepository;
3844
import org.springframework.session.jdbc.JdbcIndexedSessionRepository;
45+
import org.springframework.session.jdbc.config.annotation.SpringSessionDataSource;
3946

4047
import static org.assertj.core.api.Assertions.assertThat;
4148
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
@@ -104,6 +111,19 @@ void disableDataSourceInitializer() {
104111
});
105112
}
106113

114+
@Test
115+
void sessionDataSourceIsUsedWhenAvailable() {
116+
this.contextRunner.withUserConfiguration(SessionDataSourceConfiguration.class)
117+
.withPropertyValues("spring.session.store-type=jdbc").run((context) -> {
118+
JdbcIndexedSessionRepository repository = validateSessionRepository(context,
119+
JdbcIndexedSessionRepository.class);
120+
assertThat(repository).extracting("jdbcOperations").extracting("dataSource")
121+
.isEqualTo(context.getBean("sessionDataSource"));
122+
assertThatExceptionOfType(BadSqlGrammarException.class).isThrownBy(
123+
() -> context.getBean(JdbcOperations.class).queryForList("select * from SPRING_SESSION"));
124+
});
125+
}
126+
107127
@Test
108128
void customTableName() {
109129
this.contextRunner
@@ -157,4 +177,29 @@ void customSaveMode() {
157177
});
158178
}
159179

180+
@Configuration
181+
static class SessionDataSourceConfiguration {
182+
183+
@Bean
184+
@SpringSessionDataSource
185+
DataSource sessionDataSource() {
186+
BasicDataSource dataSource = new BasicDataSource();
187+
dataSource.setDriverClassName("org.hsqldb.jdbcDriver");
188+
dataSource.setUrl("jdbc:hsqldb:mem:sessiondb");
189+
dataSource.setUsername("sa");
190+
return dataSource;
191+
}
192+
193+
@Bean
194+
@Primary
195+
DataSource mainDataSource() {
196+
BasicDataSource dataSource = new BasicDataSource();
197+
dataSource.setDriverClassName("org.hsqldb.jdbcDriver");
198+
dataSource.setUrl("jdbc:hsqldb:mem:maindb");
199+
dataSource.setUsername("sa");
200+
return dataSource;
201+
}
202+
203+
}
204+
160205
}

0 commit comments

Comments
 (0)