gpt4 book ai didi

java - 如何扩展 CassandraRepository

转载 作者:行者123 更新时间:2023-11-30 07:00:40 25 4
gpt4 key购买 nike

如何在 spring-data-cassandra 中扩展 CassandraRepository?
我尝试了很多不同的组合来使其发挥作用,最终我得到了下面的结果。

用户.java

@Table(name = User.TABLE)
public class User {
private static final String TABLE = "user";

@PartitionKey
private UUID id;

@Column
private String name;

// Getter setter methods
...
}

CassandraRepositoryCustom.java

@NoRepositoryBean
public interface CassandraRepositoryCustom<T> extends CassandraRepository<T> {
public T save(T t, Options options);
}

CassandraRepositoryImpl.java

public class CassandraRepositoryImpl<T> 
extends SimpleCassandraRepository<T, MapId>
implements CassandraRepositoryCustom<T> {

public CassandraRepositoryImpl(CassandraEntityInformation<T, MapId> metadata,
CassandraOperations operations) {
super(metadata, operations);
}

@Override
public T save(T t, Options options) {
...
}
}

UserRepositoryCustom.java

public interface UserRepositoryCustom extends CassandraRepositoryCustom<User> {
User findById(UUID id);
}

UserRepositoryImpl.java

public class UserRepositoryImpl 
extends CassandraRepositoryImpl<User>
implements CassandraRepositoryCustom<User> {

public UserRepositoryImpl(CassandraEntityInformation<T, MapId> metadata,
CassandraOperations operations) {
super(metadata, operations);
}

}

UserDao.java

@Component
public class UserDao {

@Autowired
private UserRepositoryCustom repo;

public save(User user, Options options) {
repo.save(user, options);
}

public getUser(UUID id) {
repo.findById(id);
}

}

CassandraConfig.java

@Configuration
@EnableCassandraRepositories(repositoryBaseClass = CassandraRepositoryImpl.class)
public class CassandraConfig {
...
}

现在我遇到的只是以下异常

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepositoryCustom': Invocation of init method failed; nested exception is org.springframework.data.mapping.PropertyReferenceException: No property save found for type User!

最佳答案

您可以通过两种方式自定义 Spring Data 存储库:

  1. 向所有存储库添加一个或多个自定义方法
  2. 向单个存储库添加一个或多个自定义方法

根据上面的代码,我推断您正在尝试添加应可用于多个存储库的方法。 reference documentation包含如何自定义单个存储库的指南。

所有存储库添加一个或多个自定义方法

向所有存储库添加方法需要执行四个步骤。如果您想提供可以从多个存储库访问的通用方法,例如使用 save(T, Options) 的示例,则此方法非常方便。 .

  1. 添加扩展 SimpleCassandraRepository 的基类包含您计划公开的方法。

    public class MyCustomizedCassandraRepository<T>
    extends SimpleCassandraRepository<T, MapId>
    implements MyCassandraRepository<T> {

    public MyCustomizedCassandraRepository(CassandraEntityInformation<T, MapId> metadata,
    CassandraOperations operations) {
    super(metadata, operations);
    }

    public T save(T entity, WriteOptions options) {

    System.out.println(String.format("Called MyCustomizedCassandraRepository.save(%s, %s)",
    entity, options));
    return entity;
    }
    }
  2. @EnableCassandraRepositories中配置基类

    @SpringBootApplication
    @EnableCassandraRepositories(repositoryBaseClass = MyCustomizedCassandraRepository.class)
    public class DemoApplication {
    // ...
    }
  3. 现在创建一个接口(interface)来声明您要公开的方法。这样做可以让您从基本接口(interface)进行扩展,而不是在每个存储库上声明方法,但这完全取决于您。

    @NoRepositoryBean
    public interface MyCassandraRepository<T> extends CassandraRepository<T> {

    /**
    * Customized save method.
    */
    T save(T entity, WriteOptions options);
    }
  4. 通过扩展基本接口(interface)来声明存储库接口(interface)

    interface UserRepository extends MyCassandraRepository<User> {
    }

关于命名没有严格的规则。重要的位是设置 repositoryBaseClass@EnableCassandraRepositories以及基本方法和存储库接口(interface)方法之间的方法名称/参数类型收敛。

我创建了一个可运行的示例来自定义存储库基类。找到本文末尾的链接。

备注

上面的代码既不能编译(因为 public UserRepositoryImpl(CassandraEntityInformation<T, MapId> metadata ),也不会导致 PropertyReferenceException .

另请参阅:

关于java - 如何扩展 CassandraRepository,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40987566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com