如何扩展 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 数据存储库:
- 向所有存储库添加一个或多个自定义方法
- 向单个存储库添加一个或多个自定义方法
根据上面的代码,我推断您正在尝试添加应该可用于多个存储库的方法。 reference documentation 包含如何自定义单个存储库的指南。
向所有 个存储库添加一个或多个自定义方法
将方法添加到所有存储库需要执行四个步骤。如果您想提供可以从多个存储库访问的通用方法,这种方法很方便,例如 save(T, Options)
.
的示例
添加一个基础 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;
}
}
在@EnableCassandraRepositories
中配置基础class
@SpringBootApplication
@EnableCassandraRepositories(repositoryBaseClass = MyCustomizedCassandraRepository.class)
public class DemoApplication {
// ...
}
现在创建一个接口来声明您要公开的方法。这样做允许您从基本接口扩展而不是在每个存储库上声明方法,但这完全取决于您。
@NoRepositoryBean
public interface MyCassandraRepository<T> extends CassandraRepository<T> {
/**
* Customized save method.
*/
T save(T entity, WriteOptions options);
}
通过扩展你的基础接口来声明你的存储库接口
interface UserRepository extends MyCassandraRepository<User> {
}
命名没有严格的规定。重要的位是在 @EnableCassandraRepositories
中设置 repositoryBaseClass
和方法 name/parameter 基本方法和存储库接口方法之间的类型收敛。
我创建了一个自定义存储库基础的可运行示例 class。找到这个 post.
末尾的 link
备注
上面的代码既不能编译(因为 public UserRepositoryImpl(CassandraEntityInformation<T, MapId> metadata
)也不会导致 PropertyReferenceException
.
另请参阅:
如何在 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 数据存储库:
- 向所有存储库添加一个或多个自定义方法
- 向单个存储库添加一个或多个自定义方法
根据上面的代码,我推断您正在尝试添加应该可用于多个存储库的方法。 reference documentation 包含如何自定义单个存储库的指南。
向所有 个存储库添加一个或多个自定义方法
将方法添加到所有存储库需要执行四个步骤。如果您想提供可以从多个存储库访问的通用方法,这种方法很方便,例如 save(T, Options)
.
添加一个基础 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; } }
在
中配置基础class@EnableCassandraRepositories
@SpringBootApplication @EnableCassandraRepositories(repositoryBaseClass = MyCustomizedCassandraRepository.class) public class DemoApplication { // ... }
现在创建一个接口来声明您要公开的方法。这样做允许您从基本接口扩展而不是在每个存储库上声明方法,但这完全取决于您。
@NoRepositoryBean public interface MyCassandraRepository<T> extends CassandraRepository<T> { /** * Customized save method. */ T save(T entity, WriteOptions options); }
通过扩展你的基础接口来声明你的存储库接口
interface UserRepository extends MyCassandraRepository<User> { }
命名没有严格的规定。重要的位是在 @EnableCassandraRepositories
中设置 repositoryBaseClass
和方法 name/parameter 基本方法和存储库接口方法之间的类型收敛。
我创建了一个自定义存储库基础的可运行示例 class。找到这个 post.
末尾的 link备注
上面的代码既不能编译(因为 public UserRepositoryImpl(CassandraEntityInformation<T, MapId> metadata
)也不会导致 PropertyReferenceException
.
另请参阅: