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?

Marco
la source

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;
Artem Bilan
la source
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:[email protected]:12345
Ali Dehghani
la source
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
Asmaier
la source
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;
    }
}
Mari Murotani
la source
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>
Danilo Teodoro
la source
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;
    }} 
Sanjay-Dev
la source
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