Java Firestore google.cloud.Timestamp解析

Java Firestore google.cloud.Timestamp解析,java,firebase,google-cloud-firestore,Java,Firebase,Google Cloud Firestore,当我收到firestore DocumentSnapshot字段(即时间戳)时,带有: 一切正常,对象o使用真实数据实例化Thu Jan 10 00:00:00 CET 2019 但当我尝试以google.cloud.Timestamp的形式接收字段时: DocumentSnapshot snapshot = message.getPayload().getDocumentSnapshot(); Timestamp ts = snapshot.getTimestamp("fieldName");

当我收到firestore DocumentSnapshot字段(即时间戳)时,带有:

一切正常,对象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无法转换为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");
                        }
                );
    });
}
对象o通常解析为正确的值,而时间戳ts用于 同一事件引发“java.util.Date”无法强制转换为 com.google.cloud.Timestamp

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


您将收到以下错误:

无法将java.util.Date转换为com.google.cloud.Timestamp

因为在数据库中,timestamp属性的类型为
Date
而不是
timestamp
。在Java中,无法将类型的对象强制转换为类型的对象,因为它们之间没有继承关系

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

Date timestamp = snapshot.getDate("timestamp");
编辑:

当您将字段设置为timestamp类型时,您将其设置为,这是另一个包的一部分。请参阅,
类时间戳扩展日期
。因此时间戳对象是一个日期,因为它继承自类

总之,
com.google.firebase
包中的类与
java.sql
包中的类不同,后者与
java.security
包中的类不同

Edit2:

根据您的评论,使用时:

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

这意味着
snapshot.get(“timestamp”)
返回的对象被强制转换为
Date
,这基本上是一样的。换句话说,你告诉编译器,不管返回的对象是什么,都要把它看作是<代码>日期>代码>对象。它之所以有效,是因为数据库中的属性类型是
Date
而不是
Firebase Timestamp

您得到以下错误:

无法将java.util.Date转换为com.google.cloud.Timestamp

因为在数据库中,timestamp属性的类型为
Date
而不是
timestamp
。在Java中,无法将类型的对象强制转换为类型的对象,因为它们之间没有继承关系

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

Date timestamp = snapshot.getDate("timestamp");
编辑:

当您将字段设置为timestamp类型时,您将其设置为,这是另一个包的一部分。请参阅,
类时间戳扩展日期
。因此时间戳对象是一个日期,因为它继承自类

总之,
com.google.firebase
包中的类与
java.sql
包中的类不同,后者与
java.security
包中的类不同

Edit2:

根据您的评论,使用时:

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

这意味着
snapshot.get(“timestamp”)
返回的对象被强制转换为
Date
,这基本上是一样的。换句话说,你告诉编译器,不管返回的对象是什么,都要把它看作是<代码>日期>代码>对象。它之所以有效,是因为您在数据库中的属性类型是
Date
而不是
Firebase Timestamp

Kotlin解决方案,它对我有效:

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

适用于我的Kotlin解决方案:

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

请添加用于获取数据的完整代码。@AlexMamo很抱歉等待了这么久的响应,我添加了firestore连接的完整实现,和firestore listener。请添加您的数据库结构,以便更清楚地查看。@AlexMamo添加了带有firestore结构的图片。请添加用于获取数据的完整代码。@AlexMamo很抱歉等待了这么久的响应,我添加了firestore连接的完整实现,和firestore listener。请添加您的数据库结构,以便更清楚地查看。@AlexMamo添加了带有firestore结构的图片。感谢帮助,您能否向我澄清,当我在firestore中将字段定义为时间戳时,为什么我的字段是日期而不是时间戳类型?(提供了有问题的图片)。上面的答案似乎不起作用,snapshot.getDate(“timestamp”);也会因与snapshot.getTimestamp(“timestamp”);相同的异常而失败;。唯一有效的解决方案是:
(java.util.Date)snapshot.get(“timestamp”)。注意:
(时间戳)快照。获取(“时间戳”)
也会因相同的异常而失败。我注意到在
com.google.cloud.firestore.DocumentSnapshot.getDate()的实现中,
使用以下代码从时间戳解析:
return((时间戳)get(字段)).toDate()-这会产生异常。感谢您的帮助,您能否向我澄清为什么在firestore中我将字段定义为时间戳时,我的字段类型是日期而不是时间戳?(提供了有问题的图片)。上面的答案似乎不起作用,snapshot.getDate(“timestamp”);也会因与snapshot.getTimestamp(“timestamp”);相同的异常而失败;。唯一有效的解决方案是:
(java.util.Date)snapshot.get(“timestamp”)。N