设置非常基本。有一个实体、一个存储库和一个与 Google Cloud Firestore 交互的服务。实体的
@Document
注释具有从特定于环境的 collectionName
文件派生的 application.properties
。
当使用有效且可用的文档 ID 进行
firestoreEntityRepository.findById(documentId)
调用时,我们会得到一个 null
返回值。如果 collectionName
使用特定环境的有效集合名称进行硬编码,我们将获得适当的文档。因此,这肯定与运行时未绑定(或未按预期顺序初始化)的集合名称有关。
Firestore 实体
import com.google.cloud.firestore.annotation.DocumentId;
import com.google.cloud.spring.data.firestore.Document;
@Document(collectionName = "${api.firestore.collection}")
public class FirestoreEntity {
@DocumentId
String documentId;
String fieldOne;
String fieldTwo;
}
Firestore 实体存储库
import com.google.cloud.spring.data.firestore.FirestoreReactiveRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface FirestoreEntityRepository extends FirestoreReactiveRepository<FirestoreEntity> {
}
Firestore 实体服务
@Service
public class FirestoreEntityService {
private final FirestoreEntityRepository firestoreEntityRepository;
public FirestoreEntityService(FirestoreEntityRepository firestoreEntityRepository) {
this.firestoreEntityRepository= firestoreEntityRepository;
}
public FirestoreEntity getFirestoreEntity(String documentId) {
return firestoreEntityRepository
.findById(documentId)
.block();
}
}
除了直接在 SpEL 中使用属性名称外,我还尝试了以下方法,
FirestoreConfigProperties
注释填充 bean @ConfigurationProperties("api.firestore")
并在 collectionName 中引用 bean 名称,如下所示,@Document(collectionName = "#{@firestoreConfigProperties.getCollection()}")
systemProperties
和environment
@Document(collectionName = "#{@environment.getProperty('api.firestore.collection')}")
@Document(collectionName = "#{systemProperties['api.firestore.collection']}")
没有任何作用。请就如何实施此解决方案向我提出一些想法。否则,我将不得不放弃 spring 数据并使用低级
Firestore
对象来执行操作。