如何在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的属性保存!
答案 0 :(得分:1)
您可以通过两种方式自定义Spring Data存储库:
从上面的代码中我推断出您正在尝试添加应该可用于多个存储库的方法。 reference documentation包含如何自定义单个存储库的指南。
向所有存储库添加方法要求您遵循以下四个步骤。如果您想提供可以从多个存储库访问的通用方法,例如save(T, Options)
的示例,这种方法很方便。
添加一个扩展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
@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> {
}
关于命名没有严格的规定。重要的是在repositoryBaseClass
中设置@EnableCassandraRepositories
以及在基本方法和存储库接口方法之间设置方法名称/参数类型。
我创建了一个可运行的示例来自定义存储库基类。找到这篇文章末尾的链接。
上面的代码既没有编译(因为public UserRepositoryImpl(CassandraEntityInformation<T, MapId> metadata
)也没有导致PropertyReferenceException
。
另见: