为了账号安全,请及时绑定邮箱和手机立即绑定

Firestore google.cloud.Timestamp 解析

Firestore google.cloud.Timestamp 解析

慕虎7371278 2022-04-28 16:02:09
当我收到带有以下内容的 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.firebasejava.sqljava.security

编辑2:

根据您的评论,使用时:

(java.util.Date) snapshot.get("timestamp");

这意味着返回的对象snapshot.get("timestamp")被强制转换为Date,这基本上是同一件事。换句话说,您告诉编译器无论返回什么对象,都将其视为一个Date对象。它之所以有效,是因为您在数据库中的属性类型是Date不是 Firebase Timestamp.


查看完整回答
反对 回复 2022-04-28
?
繁星淼淼

TA贡献1775条经验 获得超11个赞

适合我的 Kotlin 解决方案:

val timestamp: Date = document.getDate("timestamp") as Date


查看完整回答
反对 回复 2022-04-28
  • 2 回答
  • 0 关注
  • 114 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信