Spring Data Cassandra
Spring Data Cassandra adds basic Reactive support.
Follow the the Getting Started part to create a freestyle(none Spring Boot) or Spring Boot based project skeleton.
If you are not using Spring Boot, firstly add the following dependencies into your project.
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-cassandra</artifactId>
</dependency>
Create a @Configuration class to configure Cassandra and add @EnableReactiveCassandraRepositories to enable reactive Repository support.
@Configuration
@EnableReactiveCassandraRepositories(basePackageClasses = {CassandraConfig.class})
public class CassandraConfig extends AbstractReactiveCassandraConfiguration {
@Value("${cassandra.keyspace-name}")
String keySpace;
@Value("${cassandra.contact-points}")
String contactPoints;
@Override
protected List<CreateKeyspaceSpecification> getKeyspaceCreations() {
CreateKeyspaceSpecification specification = CreateKeyspaceSpecification.createKeyspace(keySpace)
.ifNotExists()
.with(KeyspaceOption.DURABLE_WRITES, true);
//.withNetworkReplication(DataCenterReplication.dcr("foo", 1), DataCenterReplication.dcr("bar", 2));
return Arrays.asList(specification);
}
@Override
protected List<DropKeyspaceSpecification> getKeyspaceDrops() {
return Arrays.asList(DropKeyspaceSpecification.dropKeyspace(keySpace));
}
@Override
protected String getKeyspaceName() {
return keySpace;
}
@Override
protected String getContactPoints() {
return contactPoints;
}
@Override
public SchemaAction getSchemaAction() {
return SchemaAction.RECREATE;
}
}
The getKeyspaceCreations configures how to create the keyspace when Cassandra is started, here we create the keyspace if it does not existed.
The getSchemaAction specifies the action of schema generation.
Create a Post class to present the table in Cassandra, and add add a @Table annotation on this class.
@Data
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table("posts")
class Post {
@PrimaryKey()
@Builder.Default
private String id = UUID.randomUUID().toString();
private String title;
private String content;
}
Add @PrimaryKey on id field, it indicates id is the primary key of posts table.
Unlike Mongo and other NoSQL, in Cassandra, you have to fill the
idfield manually before it is inserted.
Next change the former PostRepository to the following:
interface PostRepository extends ReactiveCassandraRepository<Post, String>{}
For the complete codes, check spring-reactive-sample/data-cassandra.
Alternatively, for Spring Boot applications, just need to add spring-boot-starter-data-cassandra-reactive into your project dependencies.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-cassandra-reactive</artifactId>
</dependency>
No need extra configuration, Spring Boot will autoconfigure Cassandra and registers all essential beans for you.
For the complete codes, check spring-reactive-sample/boot-data-cassandra.
Add some sample data via a CommandLineRunner bean or a ApplicationRunner bean.
public void init() {
log.info("start data initialization ...");
this.posts
.deleteAll()
.thenMany(
Flux
.just("Post one", "Post two")
.flatMap(
title -> this.posts.save(Post.builder().title(title).content("content of " + title).build())
)
)
.log()
.subscribe(
null,
null,
() -> log.info("done initialization...")
);
}