From 6424910c83d21d46fcf169419bec903f51405fb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Fri, 6 May 2016 01:03:56 +1000 Subject: [PATCH] Support placeholder resolution for tableName in EnableJdbcHttpSession Fixes gh-512 --- .../http/JdbcHttpSessionConfiguration.java | 16 ++++++++++++-- .../JdbcHttpSessionConfigurationTests.java | 21 +++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/spring-session/src/main/java/org/springframework/session/jdbc/config/annotation/web/http/JdbcHttpSessionConfiguration.java b/spring-session/src/main/java/org/springframework/session/jdbc/config/annotation/web/http/JdbcHttpSessionConfiguration.java index d59e305..d4def0f 100644 --- a/spring-session/src/main/java/org/springframework/session/jdbc/config/annotation/web/http/JdbcHttpSessionConfiguration.java +++ b/spring-session/src/main/java/org/springframework/session/jdbc/config/annotation/web/http/JdbcHttpSessionConfiguration.java @@ -23,6 +23,7 @@ import javax.sql.DataSource; import org.springframework.beans.factory.BeanClassLoaderAware; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.EmbeddedValueResolverAware; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.ImportAware; @@ -44,6 +45,7 @@ import org.springframework.session.jdbc.JdbcOperationsSessionRepository; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.util.ClassUtils; import org.springframework.util.StringUtils; +import org.springframework.util.StringValueResolver; /** * Spring @Configuration class used to configure and initialize a JDBC based HttpSession @@ -61,7 +63,7 @@ import org.springframework.util.StringUtils; @Configuration @EnableScheduling public class JdbcHttpSessionConfiguration extends SpringHttpSessionConfiguration - implements BeanClassLoaderAware, ImportAware { + implements BeanClassLoaderAware, ImportAware, EmbeddedValueResolverAware { private String tableName; @@ -77,6 +79,8 @@ public class JdbcHttpSessionConfiguration extends SpringHttpSessionConfiguration private ClassLoader classLoader; + private StringValueResolver embeddedValueResolver; + @Bean public JdbcTemplate springSessionJdbcOperations(DataSource dataSource) { return new JdbcTemplate(dataSource); @@ -186,11 +190,19 @@ public class JdbcHttpSessionConfiguration extends SpringHttpSessionConfiguration Map enableAttrMap = importMetadata .getAnnotationAttributes(EnableJdbcHttpSession.class.getName()); AnnotationAttributes enableAttrs = AnnotationAttributes.fromMap(enableAttrMap); - this.tableName = enableAttrs.getString("tableName"); + String tableNameValue = enableAttrs.getString("tableName"); + if (StringUtils.hasText(tableNameValue)) { + this.tableName = this.embeddedValueResolver + .resolveStringValue(tableNameValue); + } this.maxInactiveIntervalInSeconds = enableAttrs .getNumber("maxInactiveIntervalInSeconds"); } + public void setEmbeddedValueResolver(StringValueResolver resolver) { + this.embeddedValueResolver = resolver; + } + /** * Property placeholder to process the @Scheduled annotation. * @return the {@link PropertySourcesPlaceholderConfigurer} to use diff --git a/spring-session/src/test/java/org/springframework/session/jdbc/config/annotation/web/http/JdbcHttpSessionConfigurationTests.java b/spring-session/src/test/java/org/springframework/session/jdbc/config/annotation/web/http/JdbcHttpSessionConfigurationTests.java index 5b87c28..99105c1 100644 --- a/spring-session/src/test/java/org/springframework/session/jdbc/config/annotation/web/http/JdbcHttpSessionConfigurationTests.java +++ b/spring-session/src/test/java/org/springframework/session/jdbc/config/annotation/web/http/JdbcHttpSessionConfigurationTests.java @@ -27,8 +27,10 @@ import org.springframework.beans.factory.UnsatisfiedDependencyException; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; import org.springframework.core.convert.ConversionService; import org.springframework.jdbc.support.lob.LobHandler; +import org.springframework.mock.env.MockEnvironment; import org.springframework.session.jdbc.JdbcOperationsSessionRepository; import org.springframework.test.util.ReflectionTestUtils; import org.springframework.transaction.PlatformTransactionManager; @@ -171,6 +173,14 @@ public class JdbcHttpSessionConfigurationTests { assertThat(repositoryConversionService).isEqualTo(conversionService); } + @Test + public void resolveTableNameByPropertyPlaceholder() { + this.context.setEnvironment(new MockEnvironment().withProperty("session.jdbc.tableName", "custom_session_table")); + registerAndRefresh(CustomJdbcHttpSessionConfiguration.class); + JdbcHttpSessionConfiguration configuration = this.context.getBean(JdbcHttpSessionConfiguration.class); + assertThat(ReflectionTestUtils.getField(configuration, "tableName")).isEqualTo("custom_session_table"); + } + private void registerAndRefresh(Class... annotatedClasses) { this.context.register(annotatedClasses); this.context.refresh(); @@ -251,4 +261,15 @@ public class JdbcHttpSessionConfigurationTests { } + @Configuration + @EnableJdbcHttpSession(tableName = "${session.jdbc.tableName}") + static class CustomJdbcHttpSessionConfiguration extends BaseConfiguration { + + @Bean + public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { + return new PropertySourcesPlaceholderConfigurer(); + } + + } + }