Spring Boot e come configurare i dettagli di connessione a MongoDB?


93

Essendo nuovo in Spring Boot, mi chiedo come posso configurare i dettagli di connessione per MongoDB. Ho provato gli esempi normali ma nessuno copre i dettagli della connessione.

Voglio specificare il database che verrà utilizzato e l'URL / la porta dell'host che esegue MongoDB.

Eventuali suggerimenti o suggerimenti?

Risposte:


108

Solo per citare Boot Docs :

È possibile impostare la spring.data.mongodb.uriproprietà per modificare l'URL o in alternativa specificare un file host/port. Ad esempio, potresti dichiarare quanto segue nel tuo application.properties:

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

Tutte le opzioni disponibili per il spring.data.mongodbprefisso sono campi di 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;

Ehi, farei lo stesso per una normale webapp usando Spring Boot? Dove posso trovare il file application.properties?
— Theo

Devi scriverlo da solo, se non vuoi fare affidamento sulle opzioni predefinite: docs.spring.io/spring-boot/docs/current/reference/html/…
— Artem Bilan

Notare che attualmente esiste un problema se si desidera impostare il campo della password poiché è un carattere []. Usa invece il campo uri. Vedi il fondo di questa segnalazione di bug: github.com/spring-projects/spring-boot/issues/536
— grahamrb

Ciao, sono abbastanza nuovo per Spring Boot. Dove impostiamo queste configurazioni? Basta passarlo come argomento o impostarlo da qualche parte?
— Siddharth,

Si prega di leggere il Manuale di riferimento sull'argomento: docs.spring.io/spring-boot/docs/current/reference/html/…
— Artem Bilan

34

spring.data.mongodb.hoste spring.data.mongodb.portnon sono supportati se stai utilizzando il driver Java Mongo 3.0 . In questi casi, spring.data.mongodb.uridovrebbe essere utilizzato per fornire tutta la configurazione, in questo modo:

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

12
E se non hai un utente o una password?
— Jesse

@Jesse in quel caso va bene, per impostazione predefinita mongo non richiede alcuna autenticazione, quindi la connessione funzionerebbe in quel caso.
— jmojico

C'è qualche opzione per dare la riconnessione automatica in spring.data.mongodb.uri?
— P Satish Patro

funzionerà per l'applicazione indipendente dei dati di primavera?
— Sumanth Varada

22

In un progetto Maven crea un file src/main/resources/application.ymlcon il seguente contenuto:

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 utilizzerà automaticamente questo file per configurare l'applicazione. Quindi puoi avviare la tua applicazione di avvio primaverile con il profilo di integrazione (e utilizzare il MongoDB locale)

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

o con il profilo di produzione (e usa il MongoDB di produzione)

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

C'è qualche opzione per dare la riconnessione automatica in spring.data.mongodb.uri?
— P Satish Patro

16

È possibile definire più dettagli estendendo 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;
    }
}

Dove vengono specificati il ​​nome utente e la password? Fornisce scuse non autorizzate, quando lo definiamo semplicemente in applicationiton.properties e quindi estendiamo AbstractMongoConfiguration.
— Noor Syed

Sarà all'interno di application.properties
— Mari Murotani

È corretto usare la variabile di profilo per farlo? if(profileActive=="dev"){ return new Fongo(getDatabaseName()).getMongo();} else { return new MongoClient(url, port); }
— anat0lius

15

È anche importante notare che MongoDB ha il concetto di " database di autenticazione ", che può essere diverso dal database a cui ti stai connettendo. Ad esempio, se utilizzi l' immagine Docker ufficiale per Mongo e specifichi le variabili d'ambiente MONGO_INITDB_ROOT_USERNAME e MONGO_INITDB_ROOT_PASSWORD , verrà creato un utente sul database " admin ", che probabilmente non è il database che desideri utilizzare. In questo caso, è necessario specificare i parametri di conseguenza nel file application.properties utilizzando:

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
non è MONGO_INITDB_ROOT_USERNAMEma MONGO_INITDB_ROOT_PASSWORDnel caso di un file password.
— Kamil Witkowski

0

Ecco come puoi fare in Spring Boot 2.0 creando MongoClient personalizzato aggiungendo Fornire più controllo per la connessione,

Segui il link github per il codice sorgente completo

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

Ecco come? Cosa - aggiungere una classe? Cos'è JPA? Dove sono le tue importazioni in questo file? Questa è una risposta incompleta nella migliore delle ipotesi.
— barrypicker
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.