猿问

Firestore google.cloud.Timestamp 解析

当我收到带有以下内容的 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 ”


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

慕虎7371278
浏览 115回答 2
2回答

蝴蝶刀刀

您收到以下错误: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.

繁星淼淼

适合我的 Kotlin 解决方案:val timestamp: Date = document.getDate("timestamp") as Date
随时随地看视频慕课网APP

相关分类

Java
我要回答