I migrated my project to using spring-data-cassandra 3.x. I resolved issues with conflicting beans by overriding CqlSessionFactoryBean bean in configurations and adding @Primary annotation for primary keyspace cassandra session bean. My project is using following gradle dependencies:
compile group: 'org.springframework.data', name: 'spring-data-cassandra', version: '3.0.5.RELEASE'
compile group: 'com.datastax.oss', name: 'java-driver-core', version: '4.6.1'
Cassandra configurations classes:
public abstract class AbstractCassandraSourceConfiguration extends AbstractCassandraConfiguration {
@Autowired
protected Environment environment;
@Override
protected int getPort() {
return Integer.parseInt(environment.getProperty("cassandra.port"));
}
@Override
protected String getContactPoints() {
return environment.getProperty("cassandra.contactpoints");
}
@Override
protected String getLocalDataCenter() {
return environment.getProperty("cassandra.data.center",
"datacenter1");
}
@Override
protected abstract String getKeyspaceName();
}
@Configuration
@EnableCassandraRepositories(basePackages = "com.data.cassandra.primary.repository",
repositoryBaseClass = CassandraRepositoryWithTtlWithTimestampImpl.class)
public class PrimaryCassandraSourceConfiguration extends AbstractCassandraSourceConfiguration {
@Override
protected String getKeyspaceName() {
return "primary_keyspace";
}
@Override
@Bean(name = "cassandraSession")
@Primary
public CqlSessionFactoryBean cassandraSession() {
final CqlSessionFactoryBean session = super.cassandraSession();
session.setKeyspaceName(getKeyspaceName());
return session;
}
@Bean(name = "cassandraTemplate")
public CassandraAdminOperations cassandraTemplate(
@Qualifier("cassandraSession") final CqlSessionFactoryBean session) {
return new CassandraAdminTemplate(session.getObject(),
cassandraConverter());
}
}
@Configuration
@EnableCassandraRepositories(cassandraTemplateRef = "secondaryCassandraTemplate",
basePackages = "com.data.cassandra.secondary.repository",
repositoryBaseClass = CassandraRepositoryWithTtlWithTimestampImpl.class)
public class SecondaryCassandraSourceConfiguration extends AbstractCassandraSourceConfiguration {
@Override
protected String getKeyspaceName() {
return "secondary_keyspace";
}
@Override
@Bean(name = "secondaryCassandraSession")
public CqlSessionFactoryBean cassandraSession() {
final CqlSessionFactoryBean session = super.cassandraSession();
session.setKeyspaceName(getKeyspaceName());
return session;
}
@Bean(name = "secondaryCassandraTemplate")
public CassandraAdminOperations cassandraTemplate(
@Qualifier("secondaryCassandraSession") final CqlSessionFactoryBean session) {
return new CassandraAdminTemplate(session.getObject(),
cassandraConverter());
}
}