首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何为CassandraEntityInformation<T、ID>提供SimpleReactiveCassandraRepository?

如何为CassandraEntityInformation<T、ID>提供SimpleReactiveCassandraRepository?
EN

Stack Overflow用户
提问于 2022-04-07 08:27:41
回答 1查看 171关注 0票数 0

我正在做一些关于spring-data-cassandra-reactive的研究,看起来我找不到或找到关于这方面的正确文档。

根据文档,您可以创建一个带有@Repository注释的@Repository,然后使用注释创建将检索所需数据的自定义查询。代码应该如下所示:

代码语言:javascript
运行
复制
@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;
    }

}

依赖关系:

代码语言:javascript
运行
复制
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。我似乎找不到它是从哪里来的,也找不到它应该如何自动连接的,我觉得我可能遗漏了什么东西,或者是依赖关系。

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-07 11:51:33

SimpleReactiveCassandraRepository是一个很好的类,因为它允许您访问ReactiveCassandraOperations,也可以访问CqlSession。这是进行细粒度操作的一个很好的方法。(LWT,Bacthes)

你是对的,不同的班级都会自动上岗。下面是一个示例代码:

代码语言:javascript
运行
复制
@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的反应性。(检查测试文件夹)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71778739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档