diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/SessionFactoryFactoryBean.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/SessionFactoryFactoryBean.java index 4a1966711..993a231d8 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/SessionFactoryFactoryBean.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/SessionFactoryFactoryBean.java @@ -145,7 +145,7 @@ public class SessionFactoryFactoryBean extends AbstractFactoryBean metadataSupplier; - private final CqlIdentifier keyspaceName; + private final Supplier keyspaceName; /** * Create a new {@link SimpleUserTypeResolver}. @@ -49,7 +50,7 @@ public class SimpleUserTypeResolver implements UserTypeResolver { Assert.notNull(session, "Session must not be null"); this.metadataSupplier = session::getMetadata; - this.keyspaceName = session.getKeyspace().orElse(CqlIdentifier.fromCql("system")); + this.keyspaceName = Lazy.of(() -> session.getKeyspace().orElse(CqlIdentifier.fromCql("system"))); } /** @@ -65,7 +66,7 @@ public class SimpleUserTypeResolver implements UserTypeResolver { Assert.notNull(keyspaceName, "Keyspace must not be null"); this.metadataSupplier = session::getMetadata; - this.keyspaceName = keyspaceName; + this.keyspaceName = Lazy.of(keyspaceName); } /** @@ -81,13 +82,13 @@ public class SimpleUserTypeResolver implements UserTypeResolver { Assert.notNull(keyspaceName, "Keyspace must not be null"); this.metadataSupplier = metadataSupplier; - this.keyspaceName = keyspaceName; + this.keyspaceName = Lazy.of(keyspaceName); } @Nullable @Override public UserDefinedType resolveType(CqlIdentifier typeName) { - return metadataSupplier.get().getKeyspace(keyspaceName) // + return metadataSupplier.get().getKeyspace(keyspaceName.get()) // .flatMap(it -> it.getUserDefinedType(typeName)) // .orElse(null); } diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/config/LazyStartupConfigurationTest.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/config/LazyStartupConfigurationTest.java index 7567ebaec..558758ef2 100644 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/config/LazyStartupConfigurationTest.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/config/LazyStartupConfigurationTest.java @@ -16,19 +16,16 @@ package org.springframework.data.cassandra.config; import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; -import java.net.InetSocketAddress; import java.util.Collections; -import com.datastax.oss.driver.api.core.CqlIdentifier; -import com.datastax.oss.driver.api.core.CqlSession; -import com.datastax.oss.driver.internal.core.metadata.DefaultEndPoint; import org.junit.jupiter.api.Test; + import org.springframework.beans.factory.BeanCreationException; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Lazy; import org.springframework.context.support.GenericApplicationContext; import org.springframework.data.cassandra.SessionFactory; import org.springframework.data.cassandra.core.CassandraTemplate; @@ -39,7 +36,11 @@ import org.springframework.data.cassandra.core.convert.MappingCassandraConverter import org.springframework.data.cassandra.core.mapping.CassandraMappingContext; import org.springframework.data.cassandra.core.mapping.SimpleUserTypeResolver; +import com.datastax.oss.driver.api.core.CqlSession; + /** + * Test for a lazily initialized session to assert no access to the Session. + * * @author Christoph Strobl */ class LazyStartupConfigurationTest { @@ -57,18 +58,15 @@ class LazyStartupConfigurationTest { @Configuration static class LazyStartupConfig { - @Lazy @Bean CqlSession cqlSession() { - - return CqlSession.builder() - .addContactEndPoint(new DefaultEndPoint(InetSocketAddress.createUnresolved("127.0.0.2", 9042))) - .withKeyspace("system") - .build(); + return mock(CqlSession.class, invocation -> { + throw new BeanCreationException("I am expected"); + }); } @Bean - public SessionFactoryFactoryBean cassandraSessionFactory(CassandraConverter converter, @Lazy CqlSession cqlSession) { + public SessionFactoryFactoryBean cassandraSessionFactory(CassandraConverter converter, CqlSession cqlSession) { SessionFactoryFactoryBean session = new SessionFactoryFactoryBean(); session.setSession(cqlSession); @@ -85,14 +83,13 @@ class LazyStartupConfigurationTest { } @Bean - public CassandraConverter cassandraConverter(CassandraMappingContext mappingContext, @Lazy CqlSession cqlSession) { + public CassandraConverter cassandraConverter(CassandraMappingContext mappingContext, CqlSession cqlSession) { MappingCassandraConverter converter = new MappingCassandraConverter(mappingContext); converter.setCodecRegistry(() -> cqlSession.getContext().getCodecRegistry()); converter.setCustomConversions(mappingContext.getCustomConversions()); - CqlIdentifier keyspace = CqlIdentifier.fromCql("system"); - converter.setUserTypeResolver(new SimpleUserTypeResolver(cqlSession::getMetadata, keyspace)); + converter.setUserTypeResolver(new SimpleUserTypeResolver(cqlSession)); return converter; }