1. Обзор
Используя Spring Data MongoDB, мы можем создать MongoClient для выполнения операций с базой данных. Однако иногда нам может понадобиться использовать несколько баз данных в наших приложениях.
В этом руководстве мы создадим несколько подключений к MongoDB. Мы также добавим несколько тестов Spring Boot, чтобы имитировать этот сценарий.
2. Приложение с несколькими базами данных с Spring Data MongoDB
При использовании MongoDB мы создаем MongoTemplate для доступа к данным. Таким образом, мы могли бы создать несколько шаблонов для подключения к различным базам данных.
Однако мы можем получить исключение NoUniqueBeanDefinitionException, потому что Spring не находит уникальный компонент.
Имея это в виду, давайте посмотрим, как мы можем создать конфигурацию Spring Boot.
2.1. Настройка зависимости
Начнем с добавления зависимостей в файл pom.xml. Во-первых, нам нужен стартер Spring Boot:
Затем нам нужны зависимости для веб-стартера и данных MongoDB:
Точно так же, если мы используем Gradle, мы добавляем в build.gradle:
В качестве альтернативы мы можем использовать Spring Initializer.
2.2. Модель
Во-первых, давайте добавим нашу модель. Мы создадим два документа, которые будут использоваться двумя разными базами данных.
Например, мы создадим документ пользователя:
Затем давайте также добавим документ Account:
2.3. Репозиторий
Затем мы создаем репозиторий для каждого класса модели с некоторыми методами Spring Data.
Во-первых, давайте добавим UserRepository:
Далее мы добавляем AccountRepository:
2.4. Свойства соединения
Давайте определим свойства для нескольких используемых нами баз данных:
Стоит отметить, что у нас есть свойство для конкретной БД, которую мы будем использовать для аутентификации.
2.5. Основная конфигурация
Теперь нам нужна наша конфигурация. Мы сделаем по одному для каждой базы данных.
Давайте посмотрим на определение нашего основного класса, используемое для UserRepository.:
Чтобы продемонстрировать, давайте разберем все bean-компоненты и аннотации.
Во-первых, мы будем получать и устанавливать свойства с помощью MongoProperties. Таким образом, мы напрямую сопоставляем все свойства bean-компоненту:
Чтобы предоставить доступ нескольким пользователям, мы используем механизм аутентификации MongoDB с MongoCredential. Мы создаем наш объект учетных данных, добавляя базу данных аутентификации, в данном случае admin:
Как было предложено в последних выпусках, мы используем SimpleMongoClientDatabaseFactory вместо создания MongoTemplate из строки подключения:
Нам нужно, чтобы наши bean-компоненты были здесь @Primary, так как мы добавим больше конфигураций базы данных. В противном случае мы попадем под ограничение уникальности, которое обсуждалось ранее.
Мы делаем то же самое с JPA, когда сопоставляем несколько EntityManager. Точно так же нам понадобится ссылка на Mongotemplate в нашем @EnableMongoRepositories:
2.6. Дополнительные конфигурации
Наконец, чтобы перепроверить, давайте взглянем на вторую конфигурацию базы данных:
В этом случае он будет ссылаться на AccountRepository или на все классы, принадлежащие одному и тому же пакету.
3. Тесты
Мы протестируем приложение на экземпляре MongoDB. Мы можем использовать MongoDB с Docker.
3.1. Запустите контейнер MongoDB
Давайте запустим контейнер MongoDB с помощью Docker Compose. Давайте посмотрим на наш шаблон YAML:
Нам нужно инициализировать пользователя root, если мы хотим, чтобы аутентификация была на месте. Чтобы заполнить базу данных большим количеством пользователей, мы добавляем монтирование привязки в файл инициализации JavaScript:
Запустим наш контейнер:
Когда контейнер запускается, он создает том для файла mongo-init.js и копирует его в точку входа контейнера.
3.2. Весенние загрузочные тесты
Давайте объединим все это в несколько базовых тестов Spring Boot:
В первую очередь мы хотим установить соединение для баз данных и пройти аутентификацию. Если этого не сделать, возможно, база данных не заполнена или экземпляр MongoDb не запущен.
В этих случаях мы можем просмотреть журналы нашего контейнера БД, например:
Стоит отметить, что исходный код JavaScript выполняется только при первом запуске контейнера. Итак, если нам нужно запустить другой скрипт, нам может потребоваться удалить том:
4. Вывод
В этой статье мы увидели, как создать несколько соединений с Spring Data MongoDB. Мы увидели, как добавить учетные данные для аутентификации. Самое главное, мы увидели, как создавать конфигурации, одна из которых должна быть с первичными bean-компонентами. Наконец, мы добавили несколько тестовых случаев для работающего экземпляра MongoDB с использованием тестирования Docker и Spring Boot.
Оригинал статьи: https://www.baeldung.com/mongodb-multiple-databases-spring-data