Skip to content

Commit c00a42f

Browse files
committed
Add auto-configuration for separate Spring Session Data MongoDB module
Closes gh-9552
1 parent c3bc32d commit c00a42f

File tree

12 files changed

+221
-2
lines changed

12 files changed

+221
-2
lines changed

spring-boot-autoconfigure/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,11 @@
527527
<artifactId>spring-session-core</artifactId>
528528
<optional>true</optional>
529529
</dependency>
530+
<dependency>
531+
<groupId>org.springframework.session</groupId>
532+
<artifactId>spring-session-data-mongodb</artifactId>
533+
<optional>true</optional>
534+
</dependency>
530535
<dependency>
531536
<groupId>org.springframework.session</groupId>
532537
<artifactId>spring-session-data-redis</artifactId>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/*
2+
* Copyright 2012-2017 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.autoconfigure.session;
18+
19+
import org.springframework.beans.factory.annotation.Autowired;
20+
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
21+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
22+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
23+
import org.springframework.context.annotation.Conditional;
24+
import org.springframework.context.annotation.Configuration;
25+
import org.springframework.data.mongodb.core.MongoOperations;
26+
import org.springframework.session.SessionRepository;
27+
import org.springframework.session.data.mongo.config.annotation.web.http.MongoHttpSessionConfiguration;
28+
29+
/**
30+
* Mongo-backed session configuration.
31+
*
32+
* @author Eddú Meléndez
33+
* @author Stephane Nicoll
34+
*/
35+
@Configuration
36+
@ConditionalOnMissingBean(SessionRepository.class)
37+
@ConditionalOnBean(MongoOperations.class)
38+
@Conditional(SessionCondition.class)
39+
@EnableConfigurationProperties(MongoSessionProperties.class)
40+
class MongoSessionConfiguration {
41+
42+
@Configuration
43+
public static class SpringBootMongoHttpSessionConfiguration
44+
extends MongoHttpSessionConfiguration {
45+
46+
@Autowired
47+
public void customize(SessionProperties sessionProperties,
48+
MongoSessionProperties mongoSessionProperties) {
49+
Integer timeout = sessionProperties.getTimeout();
50+
if (timeout != null) {
51+
setMaxInactiveIntervalInSeconds(timeout);
52+
}
53+
setCollectionName(mongoSessionProperties.getCollectionName());
54+
}
55+
56+
}
57+
58+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*
2+
* Copyright 2012-2017 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.autoconfigure.session;
18+
19+
import org.springframework.boot.context.properties.ConfigurationProperties;
20+
21+
/**
22+
* Configuration properties for Mongo-backed Spring Session.
23+
*
24+
* @author Andy Wilkinson
25+
* @since 2.0.0
26+
*/
27+
@ConfigurationProperties(prefix = "spring.session.mongo")
28+
public class MongoSessionProperties {
29+
30+
/**
31+
* Collection name used to store sessions.
32+
*/
33+
private String collectionName = "sessions";
34+
35+
public String getCollectionName() {
36+
return this.collectionName;
37+
}
38+
39+
public void setCollectionName(String collectionName) {
40+
this.collectionName = collectionName;
41+
}
42+
43+
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration;
3333
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
3434
import org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration;
35+
import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
3536
import org.springframework.boot.autoconfigure.session.SessionAutoConfiguration.SessionRepositoryConfiguration;
3637
import org.springframework.boot.autoconfigure.session.SessionAutoConfiguration.SessionRepositoryValidator;
3738
import org.springframework.boot.context.properties.EnableConfigurationProperties;
@@ -58,7 +59,8 @@
5859
@ConditionalOnWebApplication(type = Type.SERVLET)
5960
@EnableConfigurationProperties(SessionProperties.class)
6061
@AutoConfigureAfter({ DataSourceAutoConfiguration.class, HazelcastAutoConfiguration.class,
61-
JdbcTemplateAutoConfiguration.class, RedisAutoConfiguration.class })
62+
JdbcTemplateAutoConfiguration.class, MongoAutoConfiguration.class,
63+
RedisAutoConfiguration.class })
6264
@Import({ SessionRepositoryConfiguration.class, SessionRepositoryValidator.class,
6365
SessionRepositoryFilterConfiguration.class })
6466
public class SessionAutoConfiguration {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ final class SessionStoreMappings {
3535
static {
3636
Map<StoreType, Class<?>> mappings = new HashMap<>();
3737
mappings.put(StoreType.REDIS, RedisSessionConfiguration.class);
38+
mappings.put(StoreType.MONGO, MongoSessionConfiguration.class);
3839
mappings.put(StoreType.JDBC, JdbcSessionConfiguration.class);
3940
mappings.put(StoreType.HAZELCAST, HazelcastSessionConfiguration.class);
4041
mappings.put(StoreType.NONE, NoOpSessionConfiguration.class);

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ public enum StoreType {
3131
*/
3232
REDIS,
3333

34+
/**
35+
* Mongo backed sessions.
36+
*/
37+
MONGO,
38+
3439
/**
3540
* JDBC backed sessions.
3641
*/

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.springframework.boot.web.servlet.FilterRegistrationBean;
3333
import org.springframework.jdbc.BadSqlGrammarException;
3434
import org.springframework.jdbc.core.JdbcOperations;
35+
import org.springframework.session.data.mongo.MongoOperationsSessionRepository;
3536
import org.springframework.session.data.redis.RedisOperationsSessionRepository;
3637
import org.springframework.session.hazelcast.HazelcastSessionRepository;
3738
import org.springframework.session.jdbc.JdbcOperationsSessionRepository;
@@ -69,6 +70,7 @@ public void defaultConfigWithUniqueStoreImplementation() {
6970
this.contextRunner
7071
.withClassLoader(
7172
new HideClassesClassLoader(HazelcastSessionRepository.class,
73+
MongoOperationsSessionRepository.class,
7274
RedisOperationsSessionRepository.class))
7375
.withConfiguration(
7476
AutoConfigurations.of(JdbcTemplateAutoConfiguration.class))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
/*
2+
* Copyright 2012-2017 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.autoconfigure.session;
18+
19+
import org.junit.Test;
20+
21+
import org.springframework.beans.DirectFieldAccessor;
22+
import org.springframework.boot.autoconfigure.AutoConfigurations;
23+
import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration;
24+
import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
25+
import org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration;
26+
import org.springframework.boot.test.context.HideClassesClassLoader;
27+
import org.springframework.boot.test.context.assertj.AssertableWebApplicationContext;
28+
import org.springframework.boot.test.context.runner.ContextConsumer;
29+
import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
30+
import org.springframework.session.data.mongo.MongoOperationsSessionRepository;
31+
import org.springframework.session.data.redis.RedisOperationsSessionRepository;
32+
import org.springframework.session.hazelcast.HazelcastSessionRepository;
33+
import org.springframework.session.jdbc.JdbcOperationsSessionRepository;
34+
35+
import static org.assertj.core.api.Assertions.assertThat;
36+
37+
/**
38+
* Mongo-specific tests for {@link SessionAutoConfiguration}.
39+
*
40+
* @author Andy Wilkinson
41+
*/
42+
public class SessionAutoConfigurationMongoTests
43+
extends AbstractSessionAutoConfigurationTests {
44+
45+
private final WebApplicationContextRunner contextRunner = new WebApplicationContextRunner()
46+
.withConfiguration(AutoConfigurations.of(SessionAutoConfiguration.class));
47+
48+
@Test
49+
public void defaultConfig() {
50+
this.contextRunner.withPropertyValues("spring.session.store-type=mongo")
51+
.withConfiguration(AutoConfigurations.of(
52+
EmbeddedMongoAutoConfiguration.class,
53+
MongoAutoConfiguration.class, MongoDataAutoConfiguration.class))
54+
.run(validateSpringSessionUsesMongo("sessions"));
55+
}
56+
57+
@Test
58+
public void defaultConfigWithUniqueStoreImplementation() {
59+
this.contextRunner
60+
.withClassLoader(
61+
new HideClassesClassLoader(HazelcastSessionRepository.class,
62+
JdbcOperationsSessionRepository.class,
63+
RedisOperationsSessionRepository.class))
64+
.withConfiguration(AutoConfigurations.of(
65+
EmbeddedMongoAutoConfiguration.class,
66+
MongoAutoConfiguration.class, MongoDataAutoConfiguration.class))
67+
.run(validateSpringSessionUsesMongo("sessions"));
68+
}
69+
70+
@Test
71+
public void mongoSessionStoreWithCustomizations() {
72+
this.contextRunner
73+
.withConfiguration(AutoConfigurations.of(
74+
EmbeddedMongoAutoConfiguration.class,
75+
MongoAutoConfiguration.class, MongoDataAutoConfiguration.class))
76+
.withPropertyValues("spring.session.store-type=mongo",
77+
"spring.session.mongo.collection-name=foo")
78+
.run(validateSpringSessionUsesMongo("foo"));
79+
}
80+
81+
private ContextConsumer<AssertableWebApplicationContext> validateSpringSessionUsesMongo(
82+
String collectionName) {
83+
return (context) -> {
84+
MongoOperationsSessionRepository repository = validateSessionRepository(
85+
context, MongoOperationsSessionRepository.class);
86+
assertThat(new DirectFieldAccessor(repository)
87+
.getPropertyValue("collectionName")).isEqualTo(collectionName);
88+
};
89+
}
90+
91+
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.springframework.boot.test.context.runner.ContextConsumer;
2828
import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
2929
import org.springframework.boot.testsupport.rule.RedisTestServer;
30+
import org.springframework.session.data.mongo.MongoOperationsSessionRepository;
3031
import org.springframework.session.data.redis.RedisFlushMode;
3132
import org.springframework.session.data.redis.RedisOperationsSessionRepository;
3233
import org.springframework.session.hazelcast.HazelcastSessionRepository;
@@ -61,7 +62,8 @@ public void defaultConfigWithUniqueStoreImplementation() {
6162
this.contextRunner
6263
.withClassLoader(
6364
new HideClassesClassLoader(HazelcastSessionRepository.class,
64-
JdbcOperationsSessionRepository.class))
65+
JdbcOperationsSessionRepository.class,
66+
MongoOperationsSessionRepository.class))
6567
.withConfiguration(AutoConfigurations.of(RedisAutoConfiguration.class))
6668
.run(validateSpringSessionUsesRedis("spring:session:event:created:",
6769
RedisFlushMode.ON_SAVE));

spring-boot-dependencies/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@
174174
<spring-retry.version>1.2.1.RELEASE</spring-retry.version>
175175
<spring-security.version>5.0.0.M4</spring-security.version>
176176
<spring-session.version>2.0.0.M4</spring-session.version>
177+
<spring-session-data-mongodb.version>2.0.0.M3</spring-session-data-mongodb.version>
177178
<spring-social.version>2.0.0.M4</spring-social.version>
178179
<spring-social-facebook.version>3.0.0.M3</spring-social-facebook.version>
179180
<spring-social-linkedin.version>2.0.0.M3</spring-social-linkedin.version>
@@ -2402,6 +2403,11 @@
24022403
<artifactId>spring-session-data-redis</artifactId>
24032404
<version>${spring-session.version}</version>
24042405
</dependency>
2406+
<dependency>
2407+
<groupId>org.springframework.session</groupId>
2408+
<artifactId>spring-session-data-mongodb</artifactId>
2409+
<version>${spring-session-data-mongodb.version}</version>
2410+
</dependency>
24052411
<dependency>
24062412
<groupId>org.springframework.session</groupId>
24072413
<artifactId>spring-session-hazelcast</artifactId>

spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,9 @@ content into your application; rather pick only the properties that you need.
427427
spring.session.jdbc.schema=classpath:org/springframework/session/jdbc/schema-@@platform@@.sql # Path to the SQL file to use to initialize the database schema.
428428
spring.session.jdbc.table-name=SPRING_SESSION # Name of database table used to store sessions.
429429
430+
# SPRING SESSION MONGO ({sc-spring-boot-autoconfigure}/session/MonogoSessionProperties.{sc-ext}[MongoSessionProperties])
431+
spring.session.mongo.collection-name=sessions # Collection name used to store sessions.
432+
430433
# SPRING SESSION REDIS ({sc-spring-boot-autoconfigure}/session/RedisSessionProperties.{sc-ext}[RedisSessionProperties])
431434
spring.session.redis.flush-mode=on-save # Sessions flush mode.
432435
spring.session.redis.namespace= # Namespace for keys used to store sessions.

spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5364,6 +5364,7 @@ classes for more details.
53645364
Spring Boot provides Spring Session auto-configuration for a wide range of stores:
53655365

53665366
* JDBC
5367+
* MongoDB
53675368
* Redis
53685369
* Hazelcast
53695370

0 commit comments

Comments
 (0)