From 19ce32dc34485bf7179aece5a85b4e73c956efea Mon Sep 17 00:00:00 2001 From: Michael Weidmann Date: Mon, 12 Dec 2022 17:01:41 +0100 Subject: [PATCH] Order SessionRepositoryCustomizer before other customizers Update `JdbcSessionConfiguration` so the `SessionRepositoryCustomizer` used to map properties is always applied before other customizers. See gh-33514 --- .../session/JdbcSessionConfiguration.java | 3 ++ .../SessionAutoConfigurationJdbcTests.java | 29 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/JdbcSessionConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/JdbcSessionConfiguration.java index 24bca4a40bf..6cdbb71af5d 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/JdbcSessionConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/JdbcSessionConfiguration.java @@ -31,6 +31,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.session.SessionRepository; import org.springframework.session.config.SessionRepositoryCustomizer; @@ -64,6 +66,7 @@ class JdbcSessionConfiguration { } @Bean + @Order(Ordered.HIGHEST_PRECEDENCE) SessionRepositoryCustomizer springBootSessionRepositoryCustomizer( SessionProperties sessionProperties, JdbcSessionProperties jdbcSessionProperties, ServerProperties serverProperties) { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationJdbcTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationJdbcTests.java index 25823254003..884464548f6 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationJdbcTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationJdbcTests.java @@ -49,6 +49,7 @@ import org.springframework.session.data.mongo.MongoIndexedSessionRepository; import org.springframework.session.data.redis.RedisIndexedSessionRepository; import org.springframework.session.hazelcast.HazelcastIndexedSessionRepository; import org.springframework.session.jdbc.JdbcIndexedSessionRepository; +import org.springframework.session.jdbc.PostgreSqlJdbcIndexedSessionRepositoryCustomizer; import org.springframework.session.jdbc.config.annotation.SpringSessionDataSource; import static org.assertj.core.api.Assertions.assertThat; @@ -243,6 +244,24 @@ class SessionAutoConfigurationJdbcTests extends AbstractSessionAutoConfiguration .hasBean("customInitializer")); } + @Test + void whenTheUserDefinesTheirOwnJdbcIndexedSessionRepositoryCustomizerThenDefaultConfigurationIsOverwritten() { + String expectedCreateSessionAttributeQuery = """ + INSERT INTO SPRING_SESSION_ATTRIBUTES (SESSION_PRIMARY_ID, ATTRIBUTE_NAME, ATTRIBUTE_BYTES) + VALUES (?, ?, ?) + ON CONFLICT (SESSION_PRIMARY_ID, ATTRIBUTE_NAME) + DO UPDATE SET ATTRIBUTE_BYTES = EXCLUDED.ATTRIBUTE_BYTES + """; + + this.contextRunner.withUserConfiguration(CustomJdbcIndexedSessionRepositoryCustomizerConfiguration.class) + .withConfiguration(AutoConfigurations.of(JdbcSessionConfiguration.class)).run((context) -> { + JdbcIndexedSessionRepository repository = validateSessionRepository(context, + JdbcIndexedSessionRepository.class); + assertThat(repository).hasFieldOrPropertyWithValue("createSessionAttributeQuery", + expectedCreateSessionAttributeQuery); + }); + } + @Configuration static class SessionDataSourceConfiguration { @@ -289,4 +308,14 @@ class SessionAutoConfigurationJdbcTests extends AbstractSessionAutoConfiguration } + @Configuration + static class CustomJdbcIndexedSessionRepositoryCustomizerConfiguration { + + @Bean + PostgreSqlJdbcIndexedSessionRepositoryCustomizer postgreSqlJdbcIndexedSessionRepositoryCustomizer() { + return new PostgreSqlJdbcIndexedSessionRepositoryCustomizer(); + } + + } + }