gpt4 book ai didi

java - Firestore google.cloud.Timestamp 解析

转载 作者:行者123 更新时间:2023-12-02 01:43:09 29 4
gpt4 key购买 nike

当我收到 firestore DocumentSnapshot 字段(时间戳)时:

DocumentSnapshot snapshot = message.getPayload().getDocumentSnapshot();
Object o = snapshot.get("fieldName);

一切正常,对象 o 已使用真实数据实例化Thu Jan 10 00:00:00 CET 2019

但是当我尝试接收该字段作为 google.cloud.Timestamp 时:

DocumentSnapshot snapshot = message.getPayload().getDocumentSnapshot();
Timestamp ts = snapshot.getTimestamp("fieldName");

时间戳 ts = (时间戳) snapshot.get("fieldName");它失败并出现错误 java.util.Date 无法转换为 com.google.cloud.Timestamp

有人可以澄清这种行为吗?我应该如何从 DocumentSnapshot 访问广告检索 google.cloud.Timestamp 对象?我仅在使用 Timestamp 对象时遇到此问题,其他所有类型都正常解析。

编辑,添加更多代码:

访问Firestore:

    @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");
}
);
});
}

Object o parses normally to right value, while Timestamp ts for the same event throws "java.util.Date cannot be cast to com.google.cloud.Timestamp"

数据库中时间戳字段定义:

enter image description here

最佳答案

您收到以下错误:

java.util.Date cannot be cast to com.google.cloud.Timestamp

因为在您的数据库中,timestamp 属性的类型为 Date不是 Timestamp。 Java 中无法强制转换 Date 类型的对象到 com.google.firebase.Timestamp 类型的对象因为他们之间没有继承关系。

要解决此问题,您需要使用以下代码行将该属性获取为 Date:

Date timestamp = snapshot.getDate("timestamp");

编辑:

当您将字段设置为时间戳类型时,您将其设置为 Timestamp ,它是另一个包的一部分。请参阅类 Timestamp 扩展了 Date。所以时间戳对象是一个 Date,因为它继承自 Date类。

作为结论,Timestamp com.google.firebase 包中的类与 Timestamp 不同来自 java.sql 包的类,它与 Timestamp 不同。存在于 java.security 包中的类。

编辑2:

根据您的评论,使用时:

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

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

关于java - Firestore google.cloud.Timestamp 解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54144543/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com