Validate Spring Session has been configured
This commit validates that a `SessionRepository` has been configured if Spring Boot is meant to auto-configure one. Closes gh-5943
This commit is contained in:
parent
5deca28a9d
commit
2b006aacb3
|
|
@ -16,6 +16,9 @@
|
|||
|
||||
package org.springframework.boot.autoconfigure.session;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
|
||||
import org.springframework.beans.factory.ObjectProvider;
|
||||
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||
|
|
@ -26,6 +29,7 @@ import org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfigurati
|
|||
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.session.SessionAutoConfiguration.SessionConfigurationImportSelector;
|
||||
import org.springframework.boot.autoconfigure.session.SessionAutoConfiguration.SessionRepositoryValidator;
|
||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Import;
|
||||
|
|
@ -33,6 +37,7 @@ import org.springframework.context.annotation.ImportSelector;
|
|||
import org.springframework.core.type.AnnotationMetadata;
|
||||
import org.springframework.session.Session;
|
||||
import org.springframework.session.SessionRepository;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
/**
|
||||
* {@link EnableAutoConfiguration Auto-configuration} for Spring Session.
|
||||
|
|
@ -50,7 +55,7 @@ import org.springframework.session.SessionRepository;
|
|||
@EnableConfigurationProperties(SessionProperties.class)
|
||||
@AutoConfigureAfter({ DataSourceAutoConfiguration.class, HazelcastAutoConfiguration.class,
|
||||
MongoAutoConfiguration.class, RedisAutoConfiguration.class })
|
||||
@Import(SessionConfigurationImportSelector.class)
|
||||
@Import({ SessionConfigurationImportSelector.class, SessionRepositoryValidator.class})
|
||||
public class SessionAutoConfiguration {
|
||||
|
||||
/**
|
||||
|
|
@ -70,4 +75,32 @@ public class SessionAutoConfiguration {
|
|||
|
||||
}
|
||||
|
||||
/**
|
||||
* Bean used to validate that a {@link SessionRepository} exists and provide a
|
||||
* meaningful if that's not the case.
|
||||
*/
|
||||
static class SessionRepositoryValidator {
|
||||
|
||||
private SessionProperties sessionProperties;
|
||||
private ObjectProvider<SessionRepository<?>> sessionRepositoryProvider;
|
||||
|
||||
SessionRepositoryValidator(SessionProperties sessionProperties,
|
||||
ObjectProvider<SessionRepository<?>> sessionRepositoryProvider) {
|
||||
this.sessionProperties = sessionProperties;
|
||||
this.sessionRepositoryProvider = sessionRepositoryProvider;
|
||||
}
|
||||
|
||||
@PostConstruct
|
||||
public void checkSessionRepository() {
|
||||
StoreType storeType = this.sessionProperties.getStoreType();
|
||||
if (storeType != StoreType.NONE) {
|
||||
Assert.notNull(this.sessionRepositoryProvider.getIfAvailable(),
|
||||
"No session repository could "
|
||||
+ "be auto-configured, check your configuration (session "
|
||||
+ "store type is '" + storeType + "')");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,9 +22,12 @@ import java.util.Collections;
|
|||
import com.hazelcast.core.Hazelcast;
|
||||
import com.hazelcast.core.HazelcastInstance;
|
||||
import com.hazelcast.core.IMap;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.rules.ExpectedException;
|
||||
|
||||
import org.springframework.beans.DirectFieldAccessor;
|
||||
import org.springframework.beans.factory.BeanCreationException;
|
||||
import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration;
|
||||
|
|
@ -53,10 +56,16 @@ import static org.mockito.Mockito.verify;
|
|||
*/
|
||||
public class SessionAutoConfigurationTests extends AbstractSessionAutoConfigurationTests {
|
||||
|
||||
@Rule
|
||||
public ExpectedException thrown = ExpectedException.none();
|
||||
|
||||
@Test
|
||||
public void autoConfigurationDisabledIfStoreTypeNotSet() {
|
||||
public void contextFailsIfStoreTypeNotSet() {
|
||||
this.thrown.expect(BeanCreationException.class);
|
||||
this.thrown.expectMessage("No session repository could be auto-configured");
|
||||
this.thrown.expectMessage("session store type is 'null'");
|
||||
|
||||
load();
|
||||
assertThat(this.context.getBeansOfType(SessionRepository.class)).hasSize(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
@ -159,6 +168,14 @@ public class SessionAutoConfigurationTests extends AbstractSessionAutoConfigurat
|
|||
.isEqualTo("foobar");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void validationFailsIfSessionRepositoryIsNotConfigured() {
|
||||
this.thrown.expect(BeanCreationException.class);
|
||||
this.thrown.expectMessage("No session repository could be auto-configured");
|
||||
this.thrown.expectMessage("session store type is 'JDBC'");
|
||||
load("spring.session.store-type=jdbc");
|
||||
}
|
||||
|
||||
@Configuration
|
||||
static class SessionRepositoryConfiguration {
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue