当我收到带有以下内容的 firestore DocumentSnapshot 字段(即时间戳)时:DocumentSnapshot snapshot = message.getPayload().getDocumentSnapshot();Object o = snapshot.get("fieldName);一切正常,Object o 用真实数据实例化Thu Jan 10 00:00:00 CET 2019但是当我尝试以 google.cloud.Timestamp 的形式接收该字段时:DocumentSnapshot snapshot = message.getPayload().getDocumentSnapshot();Timestamp ts = snapshot.getTimestamp("fieldName");或者Timestamp ts = (Timestamp) snapshot.get("fieldName"); 它失败并出现错误java.util.Date cannot be cast to com.google.cloud.Timestamp有人可以澄清这种行为吗?我应该如何从 DocumentSnapshot 访问广告检索 google.cloud.Timestamp 对象?我只对 Timestamp 对象有这个问题,其他所有类型都正常解析。编辑,添加更多代码:访问火库: @Bean public FirestoreGateway registerFirestoreGateway(FirestoreGatewayProperties properties) throws IOException { Resource resource = new ClassPathResource(properties.getFirestoreConfiguration()); InputStream configuration = resource.getInputStream(); FirebaseOptions options = new FirebaseOptions.Builder() .setCredentials(GoogleCredentials.fromStream(configuration)) .setDatabaseUrl(properties.getDatabaseUrl()) .build(); FirebaseApp.initializeApp(options); return new FirestoreGateway(FirestoreClient.getFirestore()); }Firestore 快照侦听器:@EventListener(ApplicationReadyEvent.class)public void listenToRequestCommands() { firestoreConnection.listCollections().forEach(collectionReference -> { collectionReference .document(properties.getFirestoreCommand()) .addSnapshotListener((snapshot, e) -> { Object o = snapshot.get("timestamp"); Timestamp ts = (Timestamp) snapshot.get("timestamp"); } ); });}对象 o通常会解析为正确的值,而同一事件的Timestamp ts会抛出“ java.util.Date cannot be cast to com.google.cloud.Timestamp ”数据库中的时间戳字段定义:
2 回答
蝴蝶刀刀
TA贡献1801条经验 获得超8个赞
您收到以下错误:
java.util.Date 不能转换为 com.google.cloud.Timestamp
因为在您的数据库中,时间戳属性是 typeDate
而不是 Timestamp
. Java 中无法将Date类型的对象转换为com.google.firebase.Timestamp类型的对象,因为它们之间没有继承关系。
要解决此问题,您需要Date
使用以下代码行将该属性设为 :
Date timestamp = snapshot.getDate("timestamp");
编辑:
当您将字段设置为时间戳类型时,您将其设置为Timestamp,它是另一个包的一部分。见,class Timestamp extends Date
。所以时间戳对象是一个Date,因为它继承自Date类。
作为结论,包中的 Timestamp 类不同于包中的Timestamp类,这在术语上与包中存在的Timestamp类不同。com.google.firebase
java.sql
java.security
编辑2:
根据您的评论,使用时:
(java.util.Date) snapshot.get("timestamp");
这意味着返回的对象snapshot.get("timestamp")
被强制转换为Date
,这基本上是同一件事。换句话说,您告诉编译器无论返回什么对象,都将其视为一个Date
对象。它之所以有效,是因为您在数据库中的属性类型是Date
而不是 Firebase Timestamp
.
繁星淼淼
TA贡献1775条经验 获得超11个赞
适合我的 Kotlin 解决方案:
val timestamp: Date = document.getDate("timestamp") as Date
添加回答
举报
0/150
提交
取消