Spring Boot і як налаштувати деталі підключення до MongoDB?


90

Будучи новим у Spring Boot, мені цікаво, як я можу налаштувати деталі підключення для MongoDB. Я пробував звичайні приклади, але жоден не охоплює деталей підключення.

Я хочу вказати базу даних, яка буде використовуватися, та url / порт хосту, на якому запущений MongoDB.

Будь-які підказки чи поради?

Відповіді:


106

Просто цитую завантажувальні документи :

Ви можете встановити spring.data.mongodb.uriвластивість змінювати URL-адресу, або ж вказати a 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/…
Артем Білан,

Зверніть увагу, що наразі існує проблема, якщо ви хочете встановити поле пароля, оскільки воно є символом []. Натомість використовуйте поле 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не підтримуються, якщо ви використовуєте драйвер Mongo 3.0 Java . У таких випадках spring.data.mongodb.uriслід використовувати всі конфігурації, наприклад:

spring.data.mongodb.uri=mongodb://user:secret@mongo1.example.com:12345

12
Що робити, якщо у вас немає користувача або пароля?
Джессі

@Jesse в такому випадку добре, за замовчуванням mongo не вимагає ніякої автентифікації, тому підключення в цьому випадку буде працювати.
jmojico

Чи є якийсь варіант, щоб надати autoreconnect у spring.data.mongodb.uri?
P

чи буде це працювати для самостійного застосування весняних даних?
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

Чи є якийсь варіант, щоб надати autoreconnect у spring.data.mongodb.uri?
P

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

Де вказано ім’я користувача та пароль? Це дає несанкціоноване видобуток, коли ми просто визначаємо його в applicaiton.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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.