ZonedDateTime mit Spring Data MongoDB

ZonedDateTime mit Spring Data MongoDB

1. Überblick

Das ModulSpring Data MongoDBverbessert die Lesbarkeit und Benutzerfreundlichkeit bei der Interaktion mit einer MongoDB-Datenbank in Spring-Projekten.

In diesem Tutorial konzentrieren wir uns darauf, wie die Java-Objekte vonZonedDateTimebeim Lesen und Schreiben in eine MongoDB-Datenbank behandelt werden.

2. Konfiguration

Um mit dem Spring Data MongoDB-Modul arbeiten zu können, müssen wir die folgende Abhängigkeit hinzufügen:


    org.springframework.data
    spring-data-mongodb
    2.1.2.RELEASE

Die neueste Version der Bibliothek finden Sie unterhere.

Definieren wir eine Modellklasse mit dem NamenAction (mit dem AttributZonedDateTime):

@Document
public class Action {
    @Id
    private String id;

    private String description;
    private ZonedDateTime time;

    // constructor, getters and setters
}

Um mit der MongoDB zu interagieren, erstellen wir auch eine Schnittstelle, die dieMongoRepository erweitert:

public interface ActionRepository extends MongoRepository { }

Jetzt definieren wir einen Test, der einAction-Objekt in eine MongoDB einfügt und bestätigt, dass es mit der richtigen Zeit gespeichert wurde. In der Assert-Bewertung entfernen wir die Nanosekunden-Informationen, da der MongoDBDate-Typ eine Genauigkeit von Millisekunden hat:

@Test
public void givenSavedAction_TimeIsRetrievedCorrectly() {
    String id = "testId";
    ZonedDateTime now = ZonedDateTime.now(ZoneOffset.UTC);

    actionRepository.save(new Action(id, "click-action", now));
    Action savedAction = actionRepository.findById(id).get();

    Assert.assertEquals(now.withNano(0), savedAction.getTime().withNano(0));
}

Nach dem Auspacken wird beim Ausführen des Tests die folgende Fehlermeldung angezeigt:

org.bson.codecs.configuration.CodecConfigurationException:
  Can't find a codec for class java.time.ZonedDateTime

Spring Data MongoDB has no ZonedDateTime converters defined. Mal sehen, wie wir sie konfigurieren können.

3. Die MongoDB-Konverter

Wir könnenZonedDateTime Objekte (über alle Modelle hinweg) verarbeiten, indem wir einen Konverter zum Lesen aus einer MongoDB und einen zum Schreiben in diese definieren.

Zum Lesen konvertieren wir von einemDate-Objekt in einZonedDateTime-Objekt. Im nächsten Beispiel verwenden wirZoneOffset.UTC, da das ObjektDatekeine Zoneninformationen speichert:

public class ZonedDateTimeReadConverter implements Converter {
    @Override
    public ZonedDateTime convert(Date date) {
        return date.toInstant().atZone(ZoneOffset.UTC);
    }
}

Dann konvertieren wir von einemZonedDateTime-Objekt in einDate-Objekt. Wir können die Zoneninformationen bei Bedarf in ein anderes Feld einfügen:

public class ZonedDateTimeWriteConverter implements Converter {
    @Override
    public Date convert(ZonedDateTime zonedDateTime) {
        return Date.from(zonedDateTime.toInstant());
    }
}

DaDate Objekte keinen Zonenversatz speichern, verwenden wir in unseren BeispielenUTC. Mit demZonedDateTimeReadConverter and und denZonedDateTimeWriteConverter, die zu denMongoCustomConversions hinzugefügt wurden, besteht unser Test nun.

Ein einfacher Ausdruck des gespeicherten Objekts sieht folgendermaßen aus:

Action{id='testId', description='click', time=2018-11-08T08:03:11.257Z}

Weitere Informationen zum Registrieren von MongoDB-Konvertern finden Sie unterthis tutorial.

4. Schlussfolgerungen

In diesem kurzen Artikel haben wir gesehen, wie MongoDB-Konverter erstellt werden, um JavaZonedDateTime-Objekte zu verarbeiten.

Die Implementierung all dieser Snippets kann inover on GitHub gefunden werden.