我正在做一些关于spring-data-cassandra-reactive的研究,看起来我找不到或找到关于这方面的正确文档。
根据文档,您可以创建一个带有@Repository注释的@Repository,然后使用注释创建将检索所需数据的自定义查询。代码应该如下所示:
@Repository
public interface UserRepository
extends ReactiveCassandraRepository<UserEntity, UUID>
{
@Query("SELECT u FROM UserEntity u WHERE username = :user ALLOW FILTERING")
Mono<UserEntity> findUserEntityByUsername(@Param("user") String user);
/**
* This is just to illustrate/simulate some custom/advanced logic that cannot be
* done via @Query()
*/
default Mono<UserEntity> saveWithBase64EncodedPassword(UserEntity entity)
{
String encodedPassword = Base64.getEncoder().encodeToString(entity.getPassword().getBytes());
entity.updatePassword(encodedPassword);
return this.save(entity);
}
}
@Table(UserEntity.TABLE_NAME)
public class UserEntity
{
public final static String TABLE_NAME = "users";
@PrimaryKeyColumn(name = "uuid", ordinal = 0, type = PrimaryKeyType.PARTITIONED)
@CassandraType(type = CassandraType.Name.UUID)
@Column
private UUID id;
@Column
@CassandraType(type = CassandraType.Name.VARCHAR)
private String username;
@Column
@CassandraType(type = CassandraType.Name.VARCHAR)
private String password;
public UserEntity()
{
this.id = UUID.randomUUID();
}
public UserEntity(String username, String password)
{
this.id = UUID.randomUUID();
this.username = username;
this.password = password;
}
public UUID getId()
{
return id;
}
public void setId(UUID id)
{
this.id = id;
}
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
public void updatePassword(String newPassword)
{
this.password = newPassword;
}
}依赖关系:
plugins {
id("org.springframework.boot") version "2.6.6"
id("io.spring.dependency-management") version "1.0.11.RELEASE"
}
dependencies {
// Embedded Cassandra Server - used for testing.
implementation("com.github.nosan:embedded-cassandra-spring-boot-starter:4.1.0")
// Spring Data Cassandra Dependencies
annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")
implementation("org.springframework.boot:spring-boot-starter-actuator")
implementation("org.springframework.boot:spring-boot-starter-data-cassandra-reactive")
testImplementation("org.springframework.boot:spring-boot-starter-test") {
exclude("org.junit.vintage:junit-vintage-engine")
exclude("com.vaadin.external.google:android-json")
}
testImplementation("io.projectreactor:reactor-test")
// /Spring Data Cassandra Dependencies
}到目前为止,这还不错。然而,为了能够使用@Autowire (在本例中代码是自动更新的),我正在尝试如何切换到实现接口
org.springframework.security.crypto.password.PasswordEncoder)
浏览一下spring-data-cassandra jar中的代码,我注意到有一个名为org.springframework.data.cassandra.repository.support.SimpleReactiveCassandraRepository的类可以扩展。它已经有了您需要为您实现的大多数常见的东西,这就是为什么它看起来像是extend的最佳候选程序。
问题来了--它需要CassandraEntityInformation<T, ID> metadata。我似乎找不到它是从哪里来的,也找不到它应该如何自动连接的,我觉得我可能遗漏了什么东西,或者是依赖关系。
有什么想法吗?
发布于 2022-04-07 11:51:33
SimpleReactiveCassandraRepository是一个很好的类,因为它允许您访问ReactiveCassandraOperations,也可以访问CqlSession。这是进行细粒度操作的一个很好的方法。(LWT,Bacthes)
你是对的,不同的班级都会自动上岗。下面是一个示例代码:
@Repository
public class OwnerReactiveCassandraRepository extends SimpleReactiveCassandraRepository<OwnerEntitySpring, UUID> {
protected final CqlSession cqlSession;
protected final ReactiveCassandraOperations reactiveCassandraTemplate;
@SuppressWarnings("unchecked")
public OwnerReactiveCassandraRepository(CqlSession cqlSession, ReactiveCassandraOperations ops) {
super(new MappingCassandraEntityInformation<OwnerEntitySpring, UUID>(
(CassandraPersistentEntity<OwnerEntitySpring>) ops.getConverter().getMappingContext()
.getRequiredPersistentEntity(OwnerEntitySpring.class), ops.getConverter()), ops);
this.cqlSession = cqlSession;
this.reactiveCassandraTemplate = ops;
}
public Flux<OwnerEntitySpring> searchByOwnerName(String ownerLastName) {
return reactiveCassandraTemplate.getReactiveCqlOperations()
.query(SimpleStatement
.builder("SELECT * FROM " + TABLE_NAME + " WHERE " + COLUMN_LASTNAME + "=?")
.addPositionalValues(ownerLastName)
.build(), (row, rownum) -> new OwnerEntitySpring(row));
}TLDR;我使用Spring实现了Spring,您可以访问完整的代码这里,这是一个逐步使用代码的研讨会。你可能想特别看看这个文件夹
在该项目中,您将发现与drivers only的反应性、与CassandraRepositories的反应性和与SimpleCassandraRepositories的反应性。(检查测试文件夹)
https://stackoverflow.com/questions/71778739
复制相似问题