2016-12-06 41 views
1

如何在spring-data-cassandra中扩展CassandraRepository?
我已经尝试了很多不同的组合来获得这个工作,最终我结束了下面。如何扩展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 { 
    ... 
} 

现在所有我遇到的是以下情况例外

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

回答

1

您可以通过两种方式定制Spring数据仓库:

  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. 基类现在创建声明你暴露的方法的接口。这样做可以让您从基本接口扩展而不是在每个存储库上声明方法,但这完全取决于您。

    @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,并在基本方法和存储库接口方法之间设置方法名/参数类型。

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

备注

的代码从既不编译(因为public UserRepositoryImpl(CassandraEntityInformation<T, MapId> metadata)以上,也不它导致PropertyReferenceException

参见:

+0

谢谢,但我仍然运行到的问题。 – kalypzo

+0

请提供可复制的测试用例(Github Repo或Gist)。 – mp911de

+0

得到你,我会提供一个,并在这里更新问题 – kalypzo