Spring Boot et comment configurer les détails de connexion à MongoDB?


89

Étant nouveau dans Spring Boot, je me demande comment je peux configurer les détails de connexion pour MongoDB. J'ai essayé les exemples normaux mais aucun ne couvre les détails de connexion.

Je veux spécifier la base de données qui va être utilisée et l'url / port de l'hôte qui exécute MongoDB.

Des conseils ou des astuces?

Réponses:


105

Juste pour citer Boot Docs :

Vous pouvez définir la spring.data.mongodb.uripropriété pour modifier l'URL ou spécifier un fichier host/port. Par exemple, vous pouvez déclarer ce qui suit dans votre application.properties:

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

Toutes les options disponibles pour le spring.data.mongodbpréfixe sont des champs de 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;

Hé, ferais-je la même chose pour une application Web normale utilisant Spring Boot? Où puis-je trouver le fichier application.properties?
Theo

Vous devez l'écrire vous-même, si vous ne voulez pas vous fier aux options par défaut: docs.spring.io/spring-boot/docs/current/reference/html/…
Artem Bilan

Notez qu'il existe actuellement un problème si vous souhaitez définir le champ de mot de passe car il s'agit d'un caractère []. Utilisez plutôt le champ uri. Voir le bas de ce rapport de bogue: github.com/spring-projects/spring-boot/issues/536
grahamrb

Salut, je suis assez nouveau sur Spring Boot. Où définissons-nous ces configurations? Passez-le simplement comme arguments ou placez-le quelque part?
Siddharth

Veuillez lire le manuel de référence sur le sujet: docs.spring.io/spring-boot/docs/current/reference/html/…
Artem Bilan

31

spring.data.mongodb.hostet spring.data.mongodb.portne sont pas pris en charge si vous utilisez le pilote Java Mongo 3.0 . Dans de tels cas, spring.data.mongodb.uridevrait être utilisé pour fournir toute la configuration, comme ceci:

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

12
Et si vous n'avez pas d'utilisateur ou de mot de passe?
Jesse

@Jesse dans ce cas c'est très bien, par défaut mongo ne nécessite aucune authentification donc la connexion fonctionnerait dans ce cas.
jmojico

Existe-t-il une option pour autoreconnecter dans spring.data.mongodb.uri?
P Satish Patro

cela fonctionnera-t-il pour une application de données de printemps autonome?
Sumanth Varada

20

Dans un projet maven, créez un fichier src/main/resources/application.ymlavec le contenu suivant:

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 utilisera automatiquement ce fichier pour configurer votre application. Ensuite, vous pouvez démarrer votre application Spring Boot soit avec le profil d'intégration (et utiliser votre MongoDB local)

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

ou avec le profil de production (et utilisez votre production MongoDB)

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

Existe-t-il une option pour autoreconnecter dans spring.data.mongodb.uri?
P Satish Patro

16

Vous pouvez définir plus de détails en étendant 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;
    }
}

Où est spécifié le nom d'utilisateur et le mot de passe? Il donne une excaption non autorisée, lorsque nous le définissons simplement dans le fichier applicaiton.properties, puis étendons AbstractMongoConfiguration.
Noor Syed

Il sera dans application.properties
Mari Murotani

Est-il correct d'utiliser la variable de profil pour ce faire? if(profileActive=="dev"){ return new Fongo(getDatabaseName()).getMongo();} else { return new MongoClient(url, port); }
anat0lius

13

Il est également important de noter que MongoDB a le concept de « base de données d'authentification », qui peut être différente de la base de données à laquelle vous vous connectez. Par exemple, si vous utilisez l' image Docker officielle pour Mongo et spécifiez les variables d'environnement MONGO_INITDB_ROOT_USERNAME et MONGO_INITDB_ROOT_PASSWORD , un utilisateur sera créé sur la base de données ' admin ', qui n'est probablement pas la base de données que vous souhaitez utiliser. Dans ce cas, vous devez spécifier les paramètres en conséquence sur votre fichier application.properties en utilisant:

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
ce n'est pas MONGO_INITDB_ROOT_USERNAMEmais MONGO_INITDB_ROOT_PASSWORDdans le cas d'un password.
Kamil Witkowski le

0

Voici comment vous pouvez faire dans Spring Boot 2.0 en créant MongoClient personnalisé en ajoutant Fournir plus de contrôle pour la connexion,

Veuillez suivre le lien github pour le code source complet

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

Voici comment? Quoi - ajouter une classe? Qu'est-ce que JPA? Où sont vos importations dans ce fichier? C'est au mieux une réponse incomplète.
barrypicker le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.