From a89cf697a6e292acbfa61aa811f5399dd4f53d87 Mon Sep 17 00:00:00 2001 From: Vedran Pavic Date: Mon, 26 Sep 2022 10:47:56 +0200 Subject: [PATCH] Ensure configuration classes can be used with @Import This commit adds tests that verify that all Spring Session configuration classes can be used with @Import, and fixes JDBC and Hazelcast HttpSession configurations and Redis WebSession configuration. --- .../MongoHttpSessionConfigurationTest.java | 18 +++++++++++++ ...ctiveMongoWebSessionConfigurationTest.java | 26 +++++++++++++++++++ .../server/RedisWebSessionConfiguration.java | 3 +++ .../RedisHttpsSessionConfigurationTests.java | 19 ++++++++++++++ ...sIndexedHttpSessionConfigurationTests.java | 19 ++++++++++++++ .../RedisWebSessionConfigurationTests.java | 19 ++++++++++++++ .../HazelcastHttpSessionConfiguration.java | 3 +++ ...azelcastHttpSessionConfigurationTests.java | 20 ++++++++++++++ .../http/JdbcHttpSessionConfiguration.java | 3 +++ .../JdbcHttpSessionConfigurationTests.java | 19 ++++++++++++++ 10 files changed, 149 insertions(+) diff --git a/spring-session-data-mongodb/src/test/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfigurationTest.java b/spring-session-data-mongodb/src/test/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfigurationTest.java index f6a12b1bb..5837bb0a7 100644 --- a/spring-session-data-mongodb/src/test/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfigurationTest.java +++ b/spring-session-data-mongodb/src/test/java/org/springframework/session/data/mongo/config/annotation/web/http/MongoHttpSessionConfigurationTest.java @@ -194,6 +194,13 @@ void customIndexResolverConfigurationWithProvidedMongoSessionConverter() { indexResolver); } + @Test + void importConfigAndCustomize() { + registerAndRefresh(ImportConfigAndCustomizeConfiguration.class); + MongoIndexedSessionRepository sessionRepository = this.context.getBean(MongoIndexedSessionRepository.class); + assertThat(sessionRepository).extracting("maxInactiveIntervalInSeconds").isEqualTo(0); + } + private void registerAndRefresh(Class... annotatedClasses) { this.context.register(annotatedClasses); @@ -333,4 +340,15 @@ IndexResolver indexResolver() { } + @Configuration(proxyBeanMethods = false) + @Import(MongoHttpSessionConfiguration.class) + static class ImportConfigAndCustomizeConfiguration extends BaseConfiguration { + + @Bean + SessionRepositoryCustomizer sessionRepositoryCustomizer() { + return (sessionRepository) -> sessionRepository.setMaxInactiveIntervalInSeconds(0); + } + + } + } diff --git a/spring-session-data-mongodb/src/test/java/org/springframework/session/data/mongo/config/annotation/web/reactive/ReactiveMongoWebSessionConfigurationTest.java b/spring-session-data-mongodb/src/test/java/org/springframework/session/data/mongo/config/annotation/web/reactive/ReactiveMongoWebSessionConfigurationTest.java index 842cc375c..8aebf9cfa 100644 --- a/spring-session-data-mongodb/src/test/java/org/springframework/session/data/mongo/config/annotation/web/reactive/ReactiveMongoWebSessionConfigurationTest.java +++ b/spring-session-data-mongodb/src/test/java/org/springframework/session/data/mongo/config/annotation/web/reactive/ReactiveMongoWebSessionConfigurationTest.java @@ -27,6 +27,7 @@ import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.ReactiveMongoOperations; import org.springframework.data.mongodb.core.index.IndexOperations; @@ -220,6 +221,15 @@ void customIndexResolverConfigurationWithProvidedMongoSessionConverter() { indexResolver); } + @Test + void importConfigAndCustomize() { + this.context = new AnnotationConfigApplicationContext(); + this.context.register(ImportConfigAndCustomizeConfiguration.class); + this.context.refresh(); + ReactiveMongoSessionRepository sessionRepository = this.context.getBean(ReactiveMongoSessionRepository.class); + assertThat(sessionRepository).extracting("maxInactiveIntervalInSeconds").isEqualTo(0); + } + /** * Reflectively extract the {@link AbstractMongoSessionConverter} from the * {@link ReactiveMongoSessionRepository}. This is to avoid expanding the surface area @@ -393,4 +403,20 @@ IndexResolver indexResolver() { } + @Configuration(proxyBeanMethods = false) + @Import(ReactiveMongoWebSessionConfiguration.class) + static class ImportConfigAndCustomizeConfiguration { + + @Bean + ReactiveMongoOperations operations() { + return mock(ReactiveMongoOperations.class); + } + + @Bean + ReactiveSessionRepositoryCustomizer sessionRepositoryCustomizer() { + return (sessionRepository) -> sessionRepository.setMaxInactiveIntervalInSeconds(0); + } + + } + } diff --git a/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/server/RedisWebSessionConfiguration.java b/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/server/RedisWebSessionConfiguration.java index 86f17e577..a1e0a8312 100644 --- a/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/server/RedisWebSessionConfiguration.java +++ b/spring-session-data-redis/src/main/java/org/springframework/session/data/redis/config/annotation/web/server/RedisWebSessionConfiguration.java @@ -140,6 +140,9 @@ public void setImportMetadata(AnnotationMetadata importMetadata) { Map attributeMap = importMetadata .getAnnotationAttributes(EnableRedisWebSession.class.getName()); AnnotationAttributes attributes = AnnotationAttributes.fromMap(attributeMap); + if (attributes == null) { + return; + } this.maxInactiveIntervalInSeconds = attributes.getNumber("maxInactiveIntervalInSeconds"); String redisNamespaceValue = attributes.getString("redisNamespace"); if (StringUtils.hasText(redisNamespaceValue)) { diff --git a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpsSessionConfigurationTests.java b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpsSessionConfigurationTests.java index ea3d4f020..736201c7d 100644 --- a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpsSessionConfigurationTests.java +++ b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpsSessionConfigurationTests.java @@ -27,6 +27,7 @@ import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Primary; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; import org.springframework.core.annotation.Order; @@ -198,6 +199,13 @@ void sessionRepositoryCustomizer() { Duration.ofSeconds(MAX_INACTIVE_INTERVAL_IN_SECONDS)); } + @Test + void importConfigAndCustomize() { + registerAndRefresh(RedisConfig.class, ImportConfigAndCustomizeConfiguration.class); + RedisSessionRepository sessionRepository = this.context.getBean(RedisSessionRepository.class); + assertThat(sessionRepository).extracting("defaultMaxInactiveInterval").isEqualTo(Duration.ZERO); + } + private void registerAndRefresh(Class... annotatedClasses) { this.context.register(annotatedClasses); this.context.refresh(); @@ -362,4 +370,15 @@ SessionRepositoryCustomizer sessionRepositoryCustomizerT } + @Configuration(proxyBeanMethods = false) + @Import(RedisHttpSessionConfiguration.class) + static class ImportConfigAndCustomizeConfiguration { + + @Bean + SessionRepositoryCustomizer sessionRepositoryCustomizer() { + return (sessionRepository) -> sessionRepository.setDefaultMaxInactiveInterval(Duration.ZERO); + } + + } + } diff --git a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisIndexedHttpSessionConfigurationTests.java b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisIndexedHttpSessionConfigurationTests.java index 8d41058fb..10acac893 100644 --- a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisIndexedHttpSessionConfigurationTests.java +++ b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisIndexedHttpSessionConfigurationTests.java @@ -27,6 +27,7 @@ import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Primary; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; import org.springframework.core.annotation.Order; @@ -231,6 +232,13 @@ void sessionRepositoryCustomizer() { MAX_INACTIVE_INTERVAL_IN_SECONDS); } + @Test + void importConfigAndCustomize() { + registerAndRefresh(RedisConfig.class, ImportConfigAndCustomizeConfiguration.class); + RedisIndexedSessionRepository sessionRepository = this.context.getBean(RedisIndexedSessionRepository.class); + assertThat(sessionRepository).extracting("defaultMaxInactiveInterval").isEqualTo(0); + } + private void registerAndRefresh(Class... annotatedClasses) { this.context.register(annotatedClasses); this.context.refresh(); @@ -424,4 +432,15 @@ SessionRepositoryCustomizer sessionRepositoryCust } + @Configuration(proxyBeanMethods = false) + @Import(RedisIndexedHttpSessionConfiguration.class) + static class ImportConfigAndCustomizeConfiguration { + + @Bean + SessionRepositoryCustomizer sessionRepositoryCustomizer() { + return (sessionRepository) -> sessionRepository.setDefaultMaxInactiveInterval(0); + } + + } + } diff --git a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/server/RedisWebSessionConfigurationTests.java b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/server/RedisWebSessionConfigurationTests.java index af5e1518b..edb44a140 100644 --- a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/server/RedisWebSessionConfigurationTests.java +++ b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/server/RedisWebSessionConfigurationTests.java @@ -25,6 +25,7 @@ import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Primary; import org.springframework.core.annotation.Order; import org.springframework.data.redis.connection.ReactiveRedisConnectionFactory; @@ -225,6 +226,13 @@ void sessionRepositoryCustomizer() { MAX_INACTIVE_INTERVAL_IN_SECONDS); } + @Test + void importConfigAndCustomize() { + registerAndRefresh(RedisConfig.class, ImportConfigAndCustomizeConfiguration.class); + ReactiveRedisSessionRepository sessionRepository = this.context.getBean(ReactiveRedisSessionRepository.class); + assertThat(sessionRepository).extracting("defaultMaxInactiveInterval").isEqualTo(0); + } + private void registerAndRefresh(Class... annotatedClasses) { this.context.register(annotatedClasses); this.context.refresh(); @@ -381,4 +389,15 @@ ReactiveSessionRepositoryCustomizer sessionRepos } + @Configuration(proxyBeanMethods = false) + @Import(RedisWebSessionConfiguration.class) + static class ImportConfigAndCustomizeConfiguration { + + @Bean + ReactiveSessionRepositoryCustomizer sessionRepositoryCustomizer() { + return (sessionRepository) -> sessionRepository.setDefaultMaxInactiveInterval(0); + } + + } + } diff --git a/spring-session-hazelcast/src/main/java/org/springframework/session/hazelcast/config/annotation/web/http/HazelcastHttpSessionConfiguration.java b/spring-session-hazelcast/src/main/java/org/springframework/session/hazelcast/config/annotation/web/http/HazelcastHttpSessionConfiguration.java index 4c5bf954c..5dfe6e31b 100644 --- a/spring-session-hazelcast/src/main/java/org/springframework/session/hazelcast/config/annotation/web/http/HazelcastHttpSessionConfiguration.java +++ b/spring-session-hazelcast/src/main/java/org/springframework/session/hazelcast/config/annotation/web/http/HazelcastHttpSessionConfiguration.java @@ -125,6 +125,9 @@ public void setImportMetadata(AnnotationMetadata importMetadata) { Map attributeMap = importMetadata .getAnnotationAttributes(EnableHazelcastHttpSession.class.getName()); AnnotationAttributes attributes = AnnotationAttributes.fromMap(attributeMap); + if (attributes == null) { + return; + } this.maxInactiveIntervalInSeconds = attributes.getNumber("maxInactiveIntervalInSeconds"); String sessionMapNameValue = attributes.getString("sessionMapName"); if (StringUtils.hasText(sessionMapNameValue)) { diff --git a/spring-session-hazelcast/src/test/java/org/springframework/session/hazelcast/config/annotation/web/http/HazelcastHttpSessionConfigurationTests.java b/spring-session-hazelcast/src/test/java/org/springframework/session/hazelcast/config/annotation/web/http/HazelcastHttpSessionConfigurationTests.java index c2ad829d5..975665364 100644 --- a/spring-session-hazelcast/src/test/java/org/springframework/session/hazelcast/config/annotation/web/http/HazelcastHttpSessionConfigurationTests.java +++ b/spring-session-hazelcast/src/test/java/org/springframework/session/hazelcast/config/annotation/web/http/HazelcastHttpSessionConfigurationTests.java @@ -27,6 +27,7 @@ import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Primary; import org.springframework.core.annotation.Order; import org.springframework.session.FlushMode; @@ -230,6 +231,14 @@ void sessionRepositoryCustomizer() { MAX_INACTIVE_INTERVAL_IN_SECONDS); } + @Test + void importConfigAndCustomize() { + registerAndRefresh(ImportConfigAndCustomizeConfiguration.class); + HazelcastIndexedSessionRepository sessionRepository = this.context + .getBean(HazelcastIndexedSessionRepository.class); + assertThat(sessionRepository).extracting("defaultMaxInactiveInterval").isEqualTo(0); + } + private void registerAndRefresh(Class... annotatedClasses) { this.context.register(annotatedClasses); this.context.refresh(); @@ -446,4 +455,15 @@ SessionRepositoryCustomizer sessionRepository } + @Configuration(proxyBeanMethods = false) + @Import(HazelcastHttpSessionConfiguration.class) + static class ImportConfigAndCustomizeConfiguration extends BaseConfiguration { + + @Bean + SessionRepositoryCustomizer sessionRepositoryCustomizer() { + return (sessionRepository) -> sessionRepository.setDefaultMaxInactiveInterval(0); + } + + } + } diff --git a/spring-session-jdbc/src/main/java/org/springframework/session/jdbc/config/annotation/web/http/JdbcHttpSessionConfiguration.java b/spring-session-jdbc/src/main/java/org/springframework/session/jdbc/config/annotation/web/http/JdbcHttpSessionConfiguration.java index b1a30d3ac..078caf661 100644 --- a/spring-session-jdbc/src/main/java/org/springframework/session/jdbc/config/annotation/web/http/JdbcHttpSessionConfiguration.java +++ b/spring-session-jdbc/src/main/java/org/springframework/session/jdbc/config/annotation/web/http/JdbcHttpSessionConfiguration.java @@ -243,6 +243,9 @@ public void setImportMetadata(AnnotationMetadata importMetadata) { Map attributeMap = importMetadata .getAnnotationAttributes(EnableJdbcHttpSession.class.getName()); AnnotationAttributes attributes = AnnotationAttributes.fromMap(attributeMap); + if (attributes == null) { + return; + } this.maxInactiveIntervalInSeconds = attributes.getNumber("maxInactiveIntervalInSeconds"); String tableNameValue = attributes.getString("tableName"); if (StringUtils.hasText(tableNameValue)) { diff --git a/spring-session-jdbc/src/test/java/org/springframework/session/jdbc/config/annotation/web/http/JdbcHttpSessionConfigurationTests.java b/spring-session-jdbc/src/test/java/org/springframework/session/jdbc/config/annotation/web/http/JdbcHttpSessionConfigurationTests.java index b2df1bd61..9ecca0898 100644 --- a/spring-session-jdbc/src/test/java/org/springframework/session/jdbc/config/annotation/web/http/JdbcHttpSessionConfigurationTests.java +++ b/spring-session-jdbc/src/test/java/org/springframework/session/jdbc/config/annotation/web/http/JdbcHttpSessionConfigurationTests.java @@ -27,6 +27,7 @@ import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Primary; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; import org.springframework.core.annotation.Order; @@ -310,6 +311,13 @@ void defaultConfigurationJdbcTemplateHasExpectedExceptionTranslator() { assertThat(jdbcTemplate.getExceptionTranslator()).isInstanceOf(SQLErrorCodeSQLExceptionTranslator.class); } + @Test + void importConfigAndCustomize() { + registerAndRefresh(DataSourceConfiguration.class, ImportConfigAndCustomizeConfiguration.class); + JdbcIndexedSessionRepository sessionRepository = this.context.getBean(JdbcIndexedSessionRepository.class); + assertThat(sessionRepository).extracting("defaultMaxInactiveInterval").isEqualTo(0); + } + private void registerAndRefresh(Class... annotatedClasses) { this.context.register(annotatedClasses); this.context.refresh(); @@ -556,4 +564,15 @@ SessionRepositoryCustomizer sessionRepositoryCusto } + @Configuration(proxyBeanMethods = false) + @Import(JdbcHttpSessionConfiguration.class) + static class ImportConfigAndCustomizeConfiguration { + + @Bean + SessionRepositoryCustomizer sessionRepositoryCustomizer() { + return (sessionRepository) -> sessionRepository.setDefaultMaxInactiveInterval(0); + } + + } + }