Spring Boot und wie konfiguriere ich Verbindungsdetails zu MongoDB?

87

Als Neuling bei Spring Boot frage ich mich, wie ich Verbindungsdetails für MongoDB konfigurieren kann. Ich habe die normalen Beispiele ausprobiert, aber keines deckt die Verbindungsdetails ab.

Ich möchte die Datenbank angeben, die verwendet werden soll, und die URL / den Port des Hosts, auf dem MongoDB ausgeführt wird.

Irgendwelche Hinweise oder Tipps?

Marco
quelle

Antworten:

104

Nur um Boot Docs zu zitieren :

Sie können die spring.data.mongodb.uriEigenschaft festlegen , um die URL zu ändern, oder alternativ a angeben host/port. Beispielsweise könnten Sie in Ihrem Konto Folgendes deklarieren application.properties:

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

Alle verfügbaren Optionen für das spring.data.mongodbPräfix sind Felder von 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
quelle
Hey, würde ich dasselbe für eine normale Webanwendung mit Spring Boot tun? Wo finde ich die Datei application.properties?
Theo
Sie müssen es selbst schreiben, wenn Sie sich nicht auf Standardoptionen verlassen möchten: docs.spring.io/spring-boot/docs/current/reference/html/…
Artem Bilan
Beachten Sie, dass derzeit ein Problem auftritt, wenn Sie das Kennwortfeld als Zeichen [] festlegen möchten. Verwenden Sie stattdessen das Uri-Feld. Siehe das Ende dieses Fehlerberichts: github.com/spring-projects/spring-boot/issues/536
grahamrb
Hallo, ich bin ziemlich neu bei Spring Boot. Wo stellen wir diese Konfigurationen ein? Einfach als Argumente übergeben oder irgendwo setzen?
Siddharth
Bitte lesen Sie das Referenzhandbuch zu diesem Thema: docs.spring.io/spring-boot/docs/current/reference/html/…
Artem Bilan
30

spring.data.mongodb.hostund spring.data.mongodb.portwerden nicht unterstützt, wenn Sie den Mongo 3.0 Java-Treiber verwenden . In solchen Fällen spring.data.mongodb.urisollte die gesamte Konfiguration wie folgt bereitgestellt werden:

spring.data.mongodb.uri=mongodb://user:[email protected]:12345
Ali Dehghani
quelle
12
Was ist, wenn Sie keinen Benutzer oder kein Passwort haben?
Jesse
@ Jesse in diesem Fall ist es in Ordnung, standardmäßig benötigt Mongo keine Authentifizierung, so dass die Verbindung in diesem Fall funktionieren würde.
jmojico
Gibt es eine Option, um autoreconnect in spring.data.mongodb.uri zu geben?
P Satish Patro
Funktioniert es für die eigenständige Federdatenanwendung?
Sumanth Varada
20

Erstellen Sie in einem Maven-Projekt eine Datei src/main/resources/application.ymlmit folgendem Inhalt:

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 verwendet diese Datei automatisch, um Ihre Anwendung zu konfigurieren. Anschließend können Sie Ihre Spring Boot-Anwendung entweder mit dem Integrationsprofil starten (und Ihre lokale MongoDB verwenden).

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

oder mit dem Produktionsprofil (und verwenden Sie Ihre Produktions-MongoDB)

java -jar -Dspring.profiles.active=production your-app.jar
Asmaier
quelle
Gibt es eine Option, um autoreconnect in spring.data.mongodb.uri zu geben?
P Satish Patro
16

Sie können weitere Details definieren, indem Sie AbstractMongoConfiguration erweitern.

@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
quelle
Wo ist der Benutzername und das Passwort angegeben? Es gibt eine nicht autorisierte Exaption, wenn wir sie nur in den applicaiton.properties definieren und dann AbstractMongoConfiguration erweitern.
Noor Syed
Es wird in application.properties sein
Mari Murotani
Ist es richtig, dafür eine Profilvariable zu verwenden? if(profileActive=="dev"){ return new Fongo(getDatabaseName()).getMongo();} else { return new MongoClient(url, port); }
Anat0lius
10

Es ist auch wichtig zu beachten, dass MongoDB das Konzept der " Authentifizierungsdatenbank " hat, das sich von der Datenbank unterscheiden kann, mit der Sie eine Verbindung herstellen. Wenn Sie beispielsweise das offizielle Docker-Image für Mongo verwenden und die Umgebungsvariablen MONGO_INITDB_ROOT_USERNAME und MONGO_INITDB_ROOT_PASSWORD angeben , wird ein Benutzer in der Datenbank ' admin ' erstellt, die wahrscheinlich nicht die Datenbank ist, die Sie verwenden möchten. In diesem Fall sollten Sie die Parameter in Ihrer Datei application.properties entsprechend angeben :

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
quelle
1
es ist nicht MONGO_INITDB_ROOT_USERNAMEaber MONGO_INITDB_ROOT_PASSWORDim Falle eines password.
Kamil Witkowski
0

So können Sie in Spring Boot 2.0 einen benutzerdefinierten MongoClient erstellen, indem Sie mehr Kontrolle für die Verbindung bereitstellen:

Bitte folgen Sie dem Github-Link für den vollständigen Quellcode

@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
quelle
Hier ist wie? Was - eine Klasse hinzufügen? Was ist JPA? Wo sind Ihre Importe in dieser Datei? Dies ist bestenfalls eine unvollständige Antwort.
Barrypicker