Polish "Rework Spring Session auto-configuration to use customizers"

See gh-32554
This commit is contained in:
Andy Wilkinson 2022-10-06 20:59:59 +01:00
parent ad8753923a
commit 7e47d3bbd6
6 changed files with 95 additions and 137 deletions

View File

@ -45,27 +45,21 @@ import org.springframework.session.hazelcast.config.annotation.web.http.Hazelcas
@ConditionalOnMissingBean(SessionRepository.class) @ConditionalOnMissingBean(SessionRepository.class)
@ConditionalOnBean(HazelcastInstance.class) @ConditionalOnBean(HazelcastInstance.class)
@EnableConfigurationProperties(HazelcastSessionProperties.class) @EnableConfigurationProperties(HazelcastSessionProperties.class)
@Import(HazelcastHttpSessionConfiguration.class)
class HazelcastSessionConfiguration { class HazelcastSessionConfiguration {
@Configuration(proxyBeanMethods = false) @Bean
@Import(HazelcastHttpSessionConfiguration.class) SessionRepositoryCustomizer<HazelcastIndexedSessionRepository> springBootSessionRepositoryCustomizer(
static class SpringBootHazelcastHttpSessionConfiguration { SessionProperties sessionProperties, HazelcastSessionProperties hazelcastSessionProperties,
ServerProperties serverProperties) {
@Bean PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
SessionRepositoryCustomizer<HazelcastIndexedSessionRepository> springBootSessionRepositoryCustomizer( return (sessionRepository) -> {
SessionProperties sessionProperties, HazelcastSessionProperties hazelcastSessionProperties, map.from(sessionProperties.determineTimeout(() -> serverProperties.getServlet().getSession().getTimeout()))
ServerProperties serverProperties) { .to((timeout) -> sessionRepository.setDefaultMaxInactiveInterval((int) timeout.getSeconds()));
PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull(); map.from(hazelcastSessionProperties::getMapName).to(sessionRepository::setSessionMapName);
return (sessionRepository) -> { map.from(hazelcastSessionProperties::getFlushMode).to(sessionRepository::setFlushMode);
map.from(sessionProperties map.from(hazelcastSessionProperties::getSaveMode).to(sessionRepository::setSaveMode);
.determineTimeout(() -> serverProperties.getServlet().getSession().getTimeout())) };
.to((timeout) -> sessionRepository.setDefaultMaxInactiveInterval((int) timeout.getSeconds()));
map.from(hazelcastSessionProperties::getMapName).to(sessionRepository::setSessionMapName);
map.from(hazelcastSessionProperties::getFlushMode).to(sessionRepository::setFlushMode);
map.from(hazelcastSessionProperties::getSaveMode).to(sessionRepository::setSaveMode);
};
}
} }
} }

View File

@ -50,7 +50,7 @@ import org.springframework.session.jdbc.config.annotation.web.http.JdbcHttpSessi
@ConditionalOnMissingBean(SessionRepository.class) @ConditionalOnMissingBean(SessionRepository.class)
@ConditionalOnBean(DataSource.class) @ConditionalOnBean(DataSource.class)
@EnableConfigurationProperties(JdbcSessionProperties.class) @EnableConfigurationProperties(JdbcSessionProperties.class)
@Import(DatabaseInitializationDependencyConfigurer.class) @Import({ DatabaseInitializationDependencyConfigurer.class, JdbcHttpSessionConfiguration.class })
class JdbcSessionConfiguration { class JdbcSessionConfiguration {
@Bean @Bean
@ -63,25 +63,19 @@ class JdbcSessionConfiguration {
return new JdbcSessionDataSourceScriptDatabaseInitializer(dataSourceToInitialize, properties); return new JdbcSessionDataSourceScriptDatabaseInitializer(dataSourceToInitialize, properties);
} }
@Configuration(proxyBeanMethods = false) @Bean
@Import(JdbcHttpSessionConfiguration.class) SessionRepositoryCustomizer<JdbcIndexedSessionRepository> springBootSessionRepositoryCustomizer(
static class SpringBootJdbcHttpSessionConfiguration { SessionProperties sessionProperties, JdbcSessionProperties jdbcSessionProperties,
ServerProperties serverProperties) {
@Bean PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
SessionRepositoryCustomizer<JdbcIndexedSessionRepository> springBootSessionRepositoryCustomizer( return (sessionRepository) -> {
SessionProperties sessionProperties, JdbcSessionProperties jdbcSessionProperties, map.from(sessionProperties.determineTimeout(() -> serverProperties.getServlet().getSession().getTimeout()))
ServerProperties serverProperties) { .to((timeout) -> sessionRepository.setDefaultMaxInactiveInterval((int) timeout.getSeconds()));
PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull(); map.from(jdbcSessionProperties::getTableName).to(sessionRepository::setTableName);
return (sessionRepository) -> { map.from(jdbcSessionProperties::getFlushMode).to(sessionRepository::setFlushMode);
map.from(sessionProperties map.from(jdbcSessionProperties::getSaveMode).to(sessionRepository::setSaveMode);
.determineTimeout(() -> serverProperties.getServlet().getSession().getTimeout())) map.from(jdbcSessionProperties::getCleanupCron).to(sessionRepository::setCleanupCron);
.to((timeout) -> sessionRepository.setDefaultMaxInactiveInterval((int) timeout.getSeconds())); };
map.from(jdbcSessionProperties::getTableName).to(sessionRepository::setTableName);
map.from(jdbcSessionProperties::getFlushMode).to(sessionRepository::setFlushMode);
map.from(jdbcSessionProperties::getSaveMode).to(sessionRepository::setSaveMode);
map.from(jdbcSessionProperties::getCleanupCron).to(sessionRepository::setCleanupCron);
};
}
} }

View File

@ -43,25 +43,19 @@ import org.springframework.session.data.mongo.config.annotation.web.reactive.Rea
@ConditionalOnMissingBean(ReactiveSessionRepository.class) @ConditionalOnMissingBean(ReactiveSessionRepository.class)
@ConditionalOnBean(ReactiveMongoOperations.class) @ConditionalOnBean(ReactiveMongoOperations.class)
@EnableConfigurationProperties(MongoSessionProperties.class) @EnableConfigurationProperties(MongoSessionProperties.class)
@Import(ReactiveMongoWebSessionConfiguration.class)
class MongoReactiveSessionConfiguration { class MongoReactiveSessionConfiguration {
@Configuration(proxyBeanMethods = false) @Bean
@Import(ReactiveMongoWebSessionConfiguration.class) ReactiveSessionRepositoryCustomizer<ReactiveMongoSessionRepository> springBootSessionRepositoryCustomizer(
static class SpringBootMongoWebSessionConfiguration { SessionProperties sessionProperties, MongoSessionProperties mongoSessionProperties,
ServerProperties serverProperties) {
@Bean PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
ReactiveSessionRepositoryCustomizer<ReactiveMongoSessionRepository> springBootSessionRepositoryCustomizer( return (sessionRepository) -> {
SessionProperties sessionProperties, MongoSessionProperties mongoSessionProperties, map.from(sessionProperties.determineTimeout(() -> serverProperties.getReactive().getSession().getTimeout()))
ServerProperties serverProperties) { .to((timeout) -> sessionRepository.setMaxInactiveIntervalInSeconds((int) timeout.getSeconds()));
PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull(); map.from(mongoSessionProperties::getCollectionName).to(sessionRepository::setCollectionName);
return (sessionRepository) -> { };
map.from(sessionProperties
.determineTimeout(() -> serverProperties.getReactive().getSession().getTimeout()))
.to((timeout) -> sessionRepository.setMaxInactiveIntervalInSeconds((int) timeout.getSeconds()));
map.from(mongoSessionProperties::getCollectionName).to(sessionRepository::setCollectionName);
};
}
} }
} }

View File

@ -43,25 +43,19 @@ import org.springframework.session.data.mongo.config.annotation.web.http.MongoHt
@ConditionalOnMissingBean(SessionRepository.class) @ConditionalOnMissingBean(SessionRepository.class)
@ConditionalOnBean(MongoOperations.class) @ConditionalOnBean(MongoOperations.class)
@EnableConfigurationProperties(MongoSessionProperties.class) @EnableConfigurationProperties(MongoSessionProperties.class)
@Import(MongoHttpSessionConfiguration.class)
class MongoSessionConfiguration { class MongoSessionConfiguration {
@Configuration(proxyBeanMethods = false) @Bean
@Import(MongoHttpSessionConfiguration.class) SessionRepositoryCustomizer<MongoIndexedSessionRepository> springBootSessionRepositoryCustomizer(
static class SpringBootMongoHttpSessionConfiguration { SessionProperties sessionProperties, MongoSessionProperties mongoSessionProperties,
ServerProperties serverProperties) {
@Bean PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
SessionRepositoryCustomizer<MongoIndexedSessionRepository> springBootSessionRepositoryCustomizer( return (sessionRepository) -> {
SessionProperties sessionProperties, MongoSessionProperties mongoSessionProperties, map.from(sessionProperties.determineTimeout(() -> serverProperties.getServlet().getSession().getTimeout()))
ServerProperties serverProperties) { .to((timeout) -> sessionRepository.setMaxInactiveIntervalInSeconds((int) timeout.getSeconds()));
PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull(); map.from(mongoSessionProperties::getCollectionName).to(sessionRepository::setCollectionName);
return (sessionRepository) -> { };
map.from(sessionProperties
.determineTimeout(() -> serverProperties.getServlet().getSession().getTimeout()))
.to((timeout) -> sessionRepository.setMaxInactiveIntervalInSeconds((int) timeout.getSeconds()));
map.from(mongoSessionProperties::getCollectionName).to(sessionRepository::setCollectionName);
};
}
} }
} }

View File

@ -43,26 +43,20 @@ import org.springframework.session.data.redis.config.annotation.web.server.Redis
@ConditionalOnMissingBean(ReactiveSessionRepository.class) @ConditionalOnMissingBean(ReactiveSessionRepository.class)
@ConditionalOnBean(ReactiveRedisConnectionFactory.class) @ConditionalOnBean(ReactiveRedisConnectionFactory.class)
@EnableConfigurationProperties(RedisSessionProperties.class) @EnableConfigurationProperties(RedisSessionProperties.class)
@Import(RedisWebSessionConfiguration.class)
class RedisReactiveSessionConfiguration { class RedisReactiveSessionConfiguration {
@Configuration(proxyBeanMethods = false) @Bean
@Import(RedisWebSessionConfiguration.class) ReactiveSessionRepositoryCustomizer<ReactiveRedisSessionRepository> springBootSessionRepositoryCustomizer(
static class SpringBootRedisWebSessionConfiguration { SessionProperties sessionProperties, RedisSessionProperties redisSessionProperties,
ServerProperties serverProperties) {
@Bean PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
ReactiveSessionRepositoryCustomizer<ReactiveRedisSessionRepository> springBootSessionRepositoryCustomizer( return (sessionRepository) -> {
SessionProperties sessionProperties, RedisSessionProperties redisSessionProperties, map.from(sessionProperties.determineTimeout(() -> serverProperties.getReactive().getSession().getTimeout()))
ServerProperties serverProperties) { .to((timeout) -> sessionRepository.setDefaultMaxInactiveInterval((int) timeout.getSeconds()));
PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull(); map.from(redisSessionProperties::getNamespace).to(sessionRepository::setRedisKeyNamespace);
return (sessionRepository) -> { map.from(redisSessionProperties::getSaveMode).to(sessionRepository::setSaveMode);
map.from(sessionProperties };
.determineTimeout(() -> serverProperties.getReactive().getSession().getTimeout()))
.to((timeout) -> sessionRepository.setDefaultMaxInactiveInterval((int) timeout.getSeconds()));
map.from(redisSessionProperties::getNamespace).to(sessionRepository::setRedisKeyNamespace);
map.from(redisSessionProperties::getSaveMode).to(sessionRepository::setSaveMode);
};
}
} }
} }

View File

@ -57,40 +57,35 @@ class RedisSessionConfiguration {
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@ConditionalOnProperty(prefix = "spring.session.redis", name = "repository-type", havingValue = "default", @ConditionalOnProperty(prefix = "spring.session.redis", name = "repository-type", havingValue = "default",
matchIfMissing = true) matchIfMissing = true)
@Import(RedisHttpSessionConfiguration.class)
static class DefaultRedisSessionConfiguration { static class DefaultRedisSessionConfiguration {
@Configuration(proxyBeanMethods = false) @Bean
@Import(RedisHttpSessionConfiguration.class) SessionRepositoryCustomizer<RedisSessionRepository> springBootSessionRepositoryCustomizer(
static class SpringBootRedisHttpSessionConfiguration { SessionProperties sessionProperties, RedisSessionProperties redisSessionProperties,
ServerProperties serverProperties) {
@Bean String cleanupCron = redisSessionProperties.getCleanupCron();
SessionRepositoryCustomizer<RedisSessionRepository> springBootSessionRepositoryCustomizer( if (cleanupCron != null) {
SessionProperties sessionProperties, RedisSessionProperties redisSessionProperties, throw new InvalidConfigurationPropertyValueException("spring.session.redis.cleanup-cron", cleanupCron,
ServerProperties serverProperties) { "Cron-based cleanup is only supported when spring.session.redis.repository-type is set to "
String cleanupCron = redisSessionProperties.getCleanupCron(); + "indexed.");
if (cleanupCron != null) {
throw new InvalidConfigurationPropertyValueException("spring.session.redis.cleanup-cron",
cleanupCron,
"Cron-based cleanup is only supported when spring.session.redis.repository-type is set to "
+ "indexed.");
}
PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
return (sessionRepository) -> {
map.from(sessionProperties
.determineTimeout(() -> serverProperties.getServlet().getSession().getTimeout()))
.to(sessionRepository::setDefaultMaxInactiveInterval);
map.from(redisSessionProperties::getNamespace).to(sessionRepository::setRedisKeyNamespace);
map.from(redisSessionProperties::getFlushMode).to(sessionRepository::setFlushMode);
map.from(redisSessionProperties::getSaveMode).to(sessionRepository::setSaveMode);
};
} }
PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
return (sessionRepository) -> {
map.from(sessionProperties
.determineTimeout(() -> serverProperties.getServlet().getSession().getTimeout()))
.to(sessionRepository::setDefaultMaxInactiveInterval);
map.from(redisSessionProperties::getNamespace).to(sessionRepository::setRedisKeyNamespace);
map.from(redisSessionProperties::getFlushMode).to(sessionRepository::setFlushMode);
map.from(redisSessionProperties::getSaveMode).to(sessionRepository::setSaveMode);
};
} }
} }
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@ConditionalOnProperty(prefix = "spring.session.redis", name = "repository-type", havingValue = "indexed") @ConditionalOnProperty(prefix = "spring.session.redis", name = "repository-type", havingValue = "indexed")
@Import(RedisIndexedHttpSessionConfiguration.class)
static class IndexedRedisSessionConfiguration { static class IndexedRedisSessionConfiguration {
@Bean @Bean
@ -102,27 +97,20 @@ class RedisSessionConfiguration {
}; };
} }
@Configuration(proxyBeanMethods = false) @Bean
@Import(RedisIndexedHttpSessionConfiguration.class) SessionRepositoryCustomizer<RedisIndexedSessionRepository> springBootSessionRepositoryCustomizer(
static class SpringBootRedisIndexedHttpSessionConfiguration { SessionProperties sessionProperties, RedisSessionProperties redisSessionProperties,
ServerProperties serverProperties) {
@Bean PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
SessionRepositoryCustomizer<RedisIndexedSessionRepository> springBootSessionRepositoryCustomizer( return (sessionRepository) -> {
SessionProperties sessionProperties, RedisSessionProperties redisSessionProperties, map.from(sessionProperties
ServerProperties serverProperties) { .determineTimeout(() -> serverProperties.getServlet().getSession().getTimeout()))
PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull(); .to((timeout) -> sessionRepository.setDefaultMaxInactiveInterval((int) timeout.getSeconds()));
return (sessionRepository) -> { map.from(redisSessionProperties::getNamespace).to(sessionRepository::setRedisKeyNamespace);
map.from(sessionProperties map.from(redisSessionProperties::getFlushMode).to(sessionRepository::setFlushMode);
.determineTimeout(() -> serverProperties.getServlet().getSession().getTimeout())) map.from(redisSessionProperties::getSaveMode).to(sessionRepository::setSaveMode);
.to((timeout) -> sessionRepository map.from(redisSessionProperties::getCleanupCron).to(sessionRepository::setCleanupCron);
.setDefaultMaxInactiveInterval((int) timeout.getSeconds())); };
map.from(redisSessionProperties::getNamespace).to(sessionRepository::setRedisKeyNamespace);
map.from(redisSessionProperties::getFlushMode).to(sessionRepository::setFlushMode);
map.from(redisSessionProperties::getSaveMode).to(sessionRepository::setSaveMode);
map.from(redisSessionProperties::getCleanupCron).to(sessionRepository::setCleanupCron);
};
}
} }
} }