Firestore google.cloud.Timestamp парсинг - PullRequest
0 голосов
/ 11 января 2019

Когда я получаю поле 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

Может ли кто-нибудь прояснить это поведение и как мне получить доступ к объявлению, получающему объект google.cloud.Timestamp из DocumentSnapshot? У меня эта проблема только с объектом 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 обычно анализируется на правильное значение, тогда как Отметка времени ts для бросает одно и то же событие " java.util.Date нельзя привести к com.google.cloud.Timestamp"

Определение поля метки времени в базе данных:

enter image description here

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Решение Kotlin, которое работает для меня:

val timestamp: Date = document.getDate("timestamp") as Date
0 голосов
/ 17 января 2019

Вы получаете следующую ошибку:

java.util.Date нельзя преобразовать в com.google.cloud.Timestamp

Поскольку в вашей базе данных свойство timestamp имеет тип Date и , а не Timestamp. В Java нет способа привести объект типа Date к объекту типа com.google.firebase.Timestamp , потому что между ними нет отношений наследования.

Чтобы решить эту проблему, вам нужно получить это свойство как Date, используя следующую строку кода:

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

Изменить:

Когда вы устанавливаете поле типа timestamp, вы устанавливаете его как Timestamp , который является частью другого пакета. Смотрите, class Timestamp extends Date. Таким образом, объект отметки времени is-a Date, поскольку он наследуется от класса Date .

В заключение, класс Timestamp из пакета com.google.firebase отличается от класса Timestamp от пакета java.sql, который в терминах отличается от Timestamp класс, который существует в пакете java.security.

Edit2:

Согласно вашему комментарию, при использовании:

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

Это означает, что объект, возвращаемый snapshot.get("timestamp"), преобразуется в Date, что в основном является тем же самым. Другими словами, вы говорите компилятору, что независимо от того, какой объект возвращается, считайте его Date объектом. И это работает, потому что тип вашей собственности в базе данных Date и , а не Firebase Timestamp.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...