Рубрики
Без рубрики

ZonedDateTime с весенними данными MongoDB

Узнайте, как создавать конвертеры MongoDB для обработки объектов Java ZonedDateTime.

Автор оригинала: baeldung.

1. Обзор

Модуль Spring Data MongoDB улучшает читаемость и удобство использования при взаимодействии с базой данных MongoDB в проектах Spring.

В этом уроке мы сосредоточимся на том, как справиться с ZonedDateTime Объекты Java при чтении и записи в базу данных MongoDB.

2. Настройка

Для работы с модулем Spring Data MongoDB нам необходимо добавить следующую зависимость:


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

Последнюю версию библиотеки можно найти здесь .

Давайте определим класс модели с именем Action (с атрибутом ZonedDateTime ):

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

    private String description;
    private ZonedDateTime time;
    
    // constructor, getters and setters 
}

Чтобы взаимодействовать с MongoDB, мы также создадим интерфейс, расширяющий MongoRepository :

public interface ActionRepository extends MongoRepository { }

Теперь мы определим тест, который вставит объект Action в MongoDB и подтвердит, что он был сохранен с правильным временем. В оценке assert мы удаляем информацию о наносекундах, так как тип MongoDB Data имеет точность в миллисекунды:

@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)); 
}

Из коробки мы получим следующую ошибку при запуске нашего теста:

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

Spring Data MongoDB не имеет определенных преобразователей ZonedDateTime . Давайте посмотрим, как мы можем их настроить.

3. Конвертеры MongoDB

Мы можем обрабатывать объекты ZonedDateTime (во всех моделях), определяя конвертер для чтения из MongoDB и один для записи в него.

Для чтения мы преобразуем объект Date в объект ZonedDateTime . В следующем примере мы используем смещение зоны .UTC с Даты объект не хранит информацию о зоне:

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

Затем мы преобразуем объект ZonedDateTime в объект Date . При необходимости мы можем добавить информацию о зоне в другое поле:

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

Поскольку объекты Date не хранят смещение зоны, мы используем UTC в наших примерах. С преобразователем чтения ZonedDateTime и преобразователем записи ZonedDateTime , добавленным в пользовательские преобразования Mongo , наш тест теперь пройдет.

Простая печать сохраненного объекта будет выглядеть следующим образом:

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

Чтобы узнать больше о том, как зарегистрировать конвертеры MongoDB, мы можем обратиться к этому учебнику .

4. Выводы

В этой краткой статье мы рассмотрели, как создать конвертеры MongoDB для обработки объектов Java ZonedDateTime .

Реализацию всех этих фрагментов можно найти на GitHub .