我已经在这个问题上搜索了数小时,但找不到与我的情况完全相符并且有解决方案的解决方案。
我有一个现有的Cassandra数据库,但打算在不久的将来迁移到MongoDB。我正在编写带有Spring Data JPA的Spring Rest API以使用Cassandra DB,但要确保将来我可以轻松切换到Mongo,而不会遇到太多麻烦。
@Entity
@Table("stb")
public class NetworkDevice {
@Id
@PrimaryKeyColumn(name = "deviceid", type = PrimaryKeyType.PARTITIONED)
private String deviceid;
// remaining fields/getters/setters/etc omitted
通用的NetworkDeviceRepository
public interface NetworkDeviceRepository {
NetworkDevice findByDeviceid(String deviceid);
}
Cassandra存储库
public interface NetworkDeviceCassandraRepository extends NetworkDeviceRepository, CassandraRepository<NetworkDevice, String>{}
Mongo资料库
public interface NetworkDeviceMongoRepository extends NetworkDeviceRepository, MongoRepository<NetworkDevice, String> {}
当项目启动时,我遇到以下错误
Invocation of init method failed; nested exception is org.springframework.data.mapping.PropertyReferenceException: No property findAll found for type NetworkDevice!
似乎Spring感到困惑,正在寻找
CrudRepository
方法名称作为我的NetworkDevice
对象上的字段,但这对我来说绝对没有意义,而且我尝试过(数小时)没有任何影响。任何帮助将不胜感激,谢谢
最佳答案
我发现了问题。显然,Cassandra将NetworkDeviceMongoRepository
标识为潜在的Cassandra存储库,因为它与NetworkDeviceCassandraRepository
位于同一软件包中。
将这两个存储库移动到不同的程序包解决了此问题。
之前
> Repository Package
+ NetworkDeviceRepository.java
+ NetworkDeviceMongoRepository.java
+ NetworkDeviceCassandraRepository.java
后
> Repository Package
+ NetworkDeviceRepository.java
> Mongo Package
+ NetworkDeviceMongoRepository.java
> Cassandra Package
+ NetworkDeviceCassandraRepository.java