如何扩展 CassandraRepository

How to extend CassandraRepository

如何在 spring-data-cassandra 中扩展 CassandraRepository?
我尝试了很多不同的组合来让它工作,最终我得到了以下结果。

User.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 数据存储库:

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

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

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

将方法添加到所有存储库需要执行四个步骤。如果您想提供可以从多个存储库访问的通用方法,这种方法很方便,例如 save(T, Options).

的示例
  1. 添加一个基础 class 扩展 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

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

    @NoRepositoryBean
    public interface MyCassandraRepository<T> extends CassandraRepository<T> {
    
        /**
         * Customized save method.
         */
         T save(T entity, WriteOptions options);
    }
    
  4. 通过扩展你的基础接口来声明你的存储库接口

    interface UserRepository extends MyCassandraRepository<User> {
    }
    

命名没有严格的规定。重要的位是在 @EnableCassandraRepositories 中设置 repositoryBaseClass 和方法 name/parameter 基本方法和存储库接口方法之间的类型收敛。

我创建了一个自定义存储库基础的可运行示例 class。找到这个 post.

末尾的 link

备注

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

另请参阅: