Java Firestore google.cloud.Timestamp解析
当我收到firestore DocumentSnapshot字段(即时间戳)时,带有: 一切正常,对象o使用真实数据实例化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");
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