Spring Boot y ¿cómo configurar los detalles de conexión a MongoDB?

90

Siendo nuevo en Spring Boot, me pregunto cómo puedo configurar los detalles de conexión para MongoDB. He probado los ejemplos normales pero ninguno cubre los detalles de la conexión.

Quiero especificar la base de datos que se utilizará y la URL / puerto del host que ejecuta MongoDB.

¿Alguna sugerencia o consejo?

Marco
fuente

Respuestas:

106

Solo para citar Boot Docs :

Puede establecer la spring.data.mongodb.uripropiedad para cambiar la URL o, alternativamente, especificar un host/port. Por ejemplo, puede declarar lo siguiente en su application.properties:

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

Todas las opciones disponibles para el spring.data.mongodbprefijo son campos 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
fuente
Oye, ¿haría lo mismo para una aplicación web normal con Spring Boot? ¿Dónde puedo encontrar el archivo application.properties?
Theo
Debe
Artem Bilan
Tenga en cuenta que actualmente existe un problema si desea establecer el campo de contraseña, ya que es un carácter []. En su lugar, use el campo uri. Consulte la parte inferior de este informe de errores: github.com/spring-projects/spring-boot/issues/536
grahamrb
Hola, soy bastante nuevo en Spring Boot. ¿Dónde establecemos esas configuraciones? ¿Pasarlo como argumentos o ponerlo en alguna parte?
Siddharth
Por favor, lea el Manual de referencia sobre el tema: docs.spring.io/spring-boot/docs/current/reference/html/…
Artem Bilan
32

spring.data.mongodb.hosty spring.data.mongodb.portno son compatibles si está utilizando el controlador Java de Mongo 3.0 . En tales casos, spring.data.mongodb.uridebe usarse para proporcionar toda la configuración, como esta:

spring.data.mongodb.uri=mongodb://user:[email protected]:12345
Ali Dehghani
fuente
12
¿Qué pasa si no tiene un usuario o contraseña?
Jesse
@Jesse en ese caso está bien, por defecto mongo no requiere ninguna autenticación, por lo que la conexión funcionaría en ese caso.
jmojico
¿Hay alguna opción para dar autoreconnect en spring.data.mongodb.uri?
P Satish Patro
¿Funcionará para la aplicación de datos de primavera independiente?
Sumanth Varada
20

En un proyecto de maven, cree un archivo src/main/resources/application.ymlcon el siguiente contenido:

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 utilizará automáticamente este archivo para configurar su aplicación. Luego puede iniciar su aplicación de arranque de primavera con el perfil de integración (y usar su MongoDB local)

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

o con el perfil de producción (y use su MongoDB de producción)

java -jar -Dspring.profiles.active=production your-app.jar
asmaier
fuente
¿Hay alguna opción para dar autoreconnect en spring.data.mongodb.uri?
P Satish Patro
16

Puede definir más detalles ampliando 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
fuente
¿Dónde se especifica el nombre de usuario y la contraseña? Proporciona una excavación no autorizada, cuando simplemente la definimos en application.properties y luego ampliamos AbstractMongoConfiguration.
Noor Syed
Estará dentro de application.properties
Mari Murotani
¿Es correcto usar la variable de perfil para hacer esto? if(profileActive=="dev"){ return new Fongo(getDatabaseName()).getMongo();} else { return new MongoClient(url, port); }
anat0lius
13

También es importante tener en cuenta que MongoDB tiene el concepto de " base de datos de autenticación ", que puede ser diferente a la base de datos a la que se está conectando. Por ejemplo, si usa la imagen oficial de Docker para Mongo y especifica las variables de entorno MONGO_INITDB_ROOT_USERNAME y MONGO_INITDB_ROOT_PASSWORD , se creará un usuario en la base de datos ' admin ', que probablemente no sea la base de datos que desea usar. En este caso, debe especificar los parámetros en consecuencia en su archivo application.properties usando:

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
fuente
1
no lo es, MONGO_INITDB_ROOT_USERNAMEpero MONGO_INITDB_ROOT_PASSWORDen el caso de un password.
Kamil Witkowski
0

A continuación, le mostramos cómo puede hacerlo en Spring Boot 2.0 creando MongoClient personalizado agregando Proporciona más control para la conexión,

Siga el enlace de github para obtener el código fuente 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;
    }} 
Sanjay-Dev
fuente
¿Así es cómo? ¿Qué? ¿Agregar una clase? ¿Qué es JPA? ¿Dónde están sus importaciones en este archivo? Esta es una respuesta incompleta en el mejor de los casos.
barrypicker