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.