如何扩展CassandraRepository

时间:2016-12-06 03:56:24

标签: java spring-boot spring-data spring-data-cassandra

如何在spring-data-cassandra中扩展CassandraRepository?
我已经尝试了很多不同的组合来实现这一点,最终我最终得到了以下内容。

User.java

form_for

CassandraRepositoryCustom.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
  ...
}

CassandraRepositoryImpl.java

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

UserRepositoryCustom.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) {
    ...
  }
}

UserRepositoryImpl.java

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

UserDao.java

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

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

}

CassandraConfig.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);
  }

}

现在我遇到的是以下异常

  

引起:org.springframework.beans.factory.BeanCreationException:创建名为'userRepositoryCustom'的bean时出错:init方法的调用失败;嵌套异常是org.springframework.data.mapping.PropertyReferenceException:找不到类型User的属性保存!

1 个答案:

答案 0 :(得分:1)

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

  1. 向所有存储库添加一个或多个自定义方法
  2. 将一个或多个自定义方法添加到单个存储库
  3. 从上面的代码中我推断出您正在尝试添加应该可用于多个存储库的方法。 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. 现在创建一个声明您正在公开的方法的界面。这样做允许您从基础接口扩展而不是在每个存储库上声明方法,但这完全取决于您。

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

      来声明存储库接口
      interface UserRepository extends MyCassandraRepository<User> {
      }
      
    5. 关于命名没有严格的规定。重要的是在repositoryBaseClass中设置@EnableCassandraRepositories以及在基本方法和存储库接口方法之间设置方法名称/参数类型。

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

      说明

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

      另见: