Spring Boot и как настроить детали подключения к MongoDB?

90

Поскольку я новичок в Spring Boot, мне интересно, как я могу настроить детали подключения для MongoDB. Я пробовал обычные примеры, но ни один из них не описывает детали подключения.

Я хочу указать базу данных, которая будет использоваться, и URL-адрес / порт хоста, на котором работает MongoDB.

Какие-нибудь подсказки или подсказки?

Марко
источник

Ответы:

106

Процитирую Boot Docs :

Вы можете установить spring.data.mongodb.uriсвойство, чтобы изменить URL-адрес, или, альтернативно, указать host/port. Например, вы можете указать в своем application.properties:

spring.data.mongodb.host=mongoserver
spring.data.mongodb.port=27017

Все доступные варианты spring.data.mongodbпрефикса - это поля MongoProperties:

private String host;

private int port = DBPort.PORT;

private String uri = "mongodb://localhost/test";

private String database;

private String gridFsDatabase;

private String username;

private char[] password;
Артем Билан
источник
Эй, можно ли сделать то же самое для обычного веб-приложения, использующего загрузку Spring? Где я могу найти файл application.properties?
Тео
Вам нужно написать это самостоятельно, если вы не хотите полагаться на параметры по умолчанию: docs.spring.io/spring-boot/docs/current/reference/html/…
Артем Билан
Обратите внимание, что в настоящее время существует проблема, если вы хотите установить поле пароля как char []. Вместо этого используйте поле uri. См. Нижнюю часть этого отчета об ошибке: github.com/spring-projects/spring-boot/issues/536
grahamrb
Привет, я новичок в Spring Boot. Где мы устанавливаем эти конфигурации? Просто передать его как аргумент или где-нибудь установить?
Сиддхарт
Пожалуйста, прочтите справочное руководство по этому вопросу: docs.spring.io/spring-boot/docs/current/reference/html/…
Артем Билан
32

spring.data.mongodb.hostи spring.data.mongodb.portне поддерживаются, если вы используете Java-драйвер Mongo 3.0 . В таких случаях spring.data.mongodb.uriследует использовать для предоставления всей конфигурации, например:

spring.data.mongodb.uri=mongodb://user:secret@mongo1.example.com:12345
Али Дехгани
источник
12
Что делать, если у вас нет пользователя или пароля?
Джесси
@Jesse, в этом случае все в порядке, по умолчанию mongo не требует никакой аутентификации, поэтому в этом случае соединение будет работать.
jmojico
Есть ли возможность дать автопереключение в spring.data.mongodb.uri?
П Сатиш Патро
Будет ли это работать для автономного приложения данных Spring?
Sumanth Varada
20

В проекте maven создайте файл src/main/resources/application.ymlсо следующим содержимым:

spring.profiles: integration
# use local or embedded mongodb at localhost:27017
---
spring.profiles: production
spring.data.mongodb.uri: mongodb://<user>:<passwd>@<host>:<port>/<dbname>

Spring Boot автоматически использует этот файл для настройки вашего приложения. Затем вы можете запустить приложение весенней загрузки либо с профилем интеграции (и использовать локальный MongoDB)

java -jar -Dspring.profiles.active=integration your-app.jar

или с производственным профилем (и используйте свою производственную MongoDB)

java -jar -Dspring.profiles.active=production your-app.jar
Асмайер
источник
Есть ли возможность дать автопереключение в spring.data.mongodb.uri?
П Сатиш Патро
16

Вы можете определить более подробную информацию, расширив AbstractMongoConfiguration.

@Configuration
@EnableMongoRepositories("demo.mongo.model")
public class SpringMongoConfig extends AbstractMongoConfiguration {
    @Value("${spring.profiles.active}")
    private String profileActive;

    @Value("${spring.application.name}")
    private String proAppName;

    @Value("${spring.data.mongodb.host}")
    private String mongoHost;

    @Value("${spring.data.mongodb.port}")
    private String mongoPort;

    @Value("${spring.data.mongodb.database}")
    private String mongoDB;

    @Override
    public MongoMappingContext mongoMappingContext()
        throws ClassNotFoundException {
        // TODO Auto-generated method stub
        return super.mongoMappingContext();
    }
    @Override
    @Bean
    public Mongo mongo() throws Exception {
        return new MongoClient(mongoHost + ":" + mongoPort);
    }
    @Override
    protected String getDatabaseName() {
        // TODO Auto-generated method stub
        return mongoDB;
    }
}
Мари Муротани
источник
Где указывается логин и пароль? Это дает несанкционированное исключение, когда мы просто определяем его в applicationaiton.properties, а затем расширяем AbstractMongoConfiguration.
Нур Сайед,
Это будет внутри application.properties
Мари Муротани
Правильно ли использовать для этого переменную профиля? if(profileActive=="dev"){ return new Fongo(getDatabaseName()).getMongo();} else { return new MongoClient(url, port); }
anat0lius
13

Также важно отметить, что MongoDB имеет концепцию « базы данных аутентификации », которая может отличаться от базы данных, к которой вы подключаетесь. Например, если вы используете официальный образ Docker для Mongo и указываете переменные среды MONGO_INITDB_ROOT_USERNAME и MONGO_INITDB_ROOT_PASSWORD , пользователь будет создан в базе данных admin , которая, вероятно, не та база данных, которую вы хотите использовать. В этом случае вам следует указать соответствующие параметры в вашем файле application.properties, используя:

spring.data.mongodb.host=127.0.0.1
spring.data.mongodb.port=27017
spring.data.mongodb.authentication-database=admin
spring.data.mongodb.username=<username specified on MONGO_INITDB_ROOT_USERNAME>
spring.data.mongodb.password=<password specified on MONGO_INITDB_ROOT_PASSWORD>
spring.data.mongodb.database=<the db you want to use>
Данило Теодоро
источник
1
это не так, MONGO_INITDB_ROOT_USERNAMEно MONGO_INITDB_ROOT_PASSWORDв случае password.
Камил Витковски,
0

Вот как вы можете это сделать в Spring Boot 2.0 , создав собственный MongoClient, добавив Обеспечение большего контроля для подключения,

Пожалуйста, перейдите по ссылке github для получения полного исходного кода

@Configuration
@EnableMongoRepositories(basePackages = { "com.frugalis.repository" })
@ComponentScan(basePackages = { "com.frugalis.*" })
@PropertySource("classpath:application.properties")
public class MongoJPAConfig extends AbstractMongoConfiguration {

    @Value("${com.frugalis.mongo.database}")
    private String database;
    @Value("${com.frugalis.mongo.server}")
    private String host;
    @Value("${com.frugalis.mongo.port}")
    private String port;
    @Value("${com.frugalis.mongo.username}")
    private String username;
    @Value("${com.frugalis.mongo.password}")
    private String password;


    @Override
    protected String getDatabaseName() {
        return database;
    }

    @Override
    protected String getMappingBasePackage() {
        return "com.frugalis.entity.mongo";
    }

    @Bean
    public MongoTemplate mongoTemplate() throws Exception {
        return new MongoTemplate(mongoClient(), getDatabaseName());
    }

    @Override
    @Bean
    public MongoClient mongoClient() {

        List<MongoCredential> allCred = new ArrayList<MongoCredential>();
        System.out.println("???????????????????"+username+" "+database+" "+password+" "+host+" "+port);
        allCred.add(MongoCredential.createCredential(username, database, password.toCharArray()));
        MongoClient client = new MongoClient((new ServerAddress(host, Integer.parseInt(port))), allCred);
        client.setWriteConcern(WriteConcern.ACKNOWLEDGED);

        return client;
    }} 
Санджай-Дев
источник
Вот как? Что - добавление класса? Что такое JPA? Где ваш импорт в этом файле? В лучшем случае это неполный ответ.
barrypicker