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 .