Spring Boot e como configurar detalhes de conexão para MongoDB?

93

Sendo novo no Spring Boot, estou me perguntando como posso configurar os detalhes de conexão para o MongoDB. Eu tentei os exemplos normais, mas nenhum cobre os detalhes da conexão.

Desejo especificar o banco de dados que será usado e a url / porta do host que executa o MongoDB.

Alguma dica ou sugestão?

Marco
fonte

Respostas:

108

Apenas para citar Boot Docs :

Você pode definir a spring.data.mongodb.uripropriedade para alterar o url ou, alternativamente, especificar a host/port. Por exemplo, você pode declarar o seguinte em application.properties:

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

Todas as opções disponíveis para spring.data.mongodbprefixo são 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
fonte
Ei, eu faria o mesmo para um webapp normal usando o Spring boot? Onde posso encontrar o arquivo application.properties?
Theo
Você precisa escrevê-lo sozinho, se não quiser confiar nas opções padrão: docs.spring.io/spring-boot/docs/current/reference/html/…
Artem Bilan
Observe que atualmente há um problema se você deseja definir o campo de senha, pois é um char []. Em vez disso, use o campo uri. Veja a parte inferior deste relatório de bug: github.com/spring-projects/spring-boot/issues/536
grahamrb
Olá, sou muito novo no Spring Boot. Onde definimos essas configurações? Apenas passar como argumentos ou definir em algum lugar?
Siddharth de
Por favor, leia o Manual de Referência sobre o assunto: docs.spring.io/spring-boot/docs/current/reference/html/…
Artem Bilan
34

spring.data.mongodb.hoste spring.data.mongodb.portnão são suportados se você estiver usando o driver Java Mongo 3.0 . Nesses casos, spring.data.mongodb.urideve ser usado para fornecer toda a configuração, assim:

spring.data.mongodb.uri=mongodb://user:[email protected]:12345
Ali Dehghani
fonte
12
E se você não tiver um usuário ou senha?
Jesse
@Jesse nesse caso está bem, por padrão o mongo não requer nenhuma autenticação, então a conexão funcionaria nesse caso.
jmojico
Existe alguma opção para dar autoreconnect em spring.data.mongodb.uri?
P Satish Patro
funcionará para aplicativos de dados de primavera independentes?
Sumanth Varada
22

Em um projeto maven, crie um arquivo src/main/resources/application.ymlcom o seguinte conteúdo:

spring.profiles: integration
# use local or embedded mongodb at localhost:27017
---
spring.profiles: production
spring.data.mongodb.uri: mongodb://<user>:<passwd>@<host>:<port>/<dbname>

O Spring Boot usará automaticamente este arquivo para configurar seu aplicativo. Em seguida, você pode iniciar seu aplicativo de inicialização de primavera com o perfil de integração (e usar seu MongoDB local)

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

ou com o perfil de produção (e use seu MongoDB de produção)

java -jar -Dspring.profiles.active=production your-app.jar
Asmaier
fonte
Existe alguma opção para dar autoreconnect em spring.data.mongodb.uri?
P Satish Patro
16

Você pode definir mais detalhes 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;
    }
}
Mari Murotani
fonte
Onde o nome de usuário e a senha são especificados? Ele fornece uma exceção não autorizada, quando apenas definimos em applicaiton.properties e, em seguida, estendemos AbstractMongoConfiguration.
Noor Syed
Estará dentro de application.properties
Mari Murotani
É correto usar a variável de perfil para fazer isso? if(profileActive=="dev"){ return new Fongo(getDatabaseName()).getMongo();} else { return new MongoClient(url, port); }
anat0lius
15

Também é importante observar que o MongoDB tem o conceito de " banco de dados de autenticação ", que pode ser diferente do banco de dados ao qual você está se conectando. Por exemplo, se você usar a imagem oficial do Docker para Mongo e especificar as variáveis ​​de ambiente MONGO_INITDB_ROOT_USERNAME e MONGO_INITDB_ROOT_PASSWORD , um usuário será criado no banco de dados ' admin ', que provavelmente não é o banco de dados que você deseja usar. Nesse caso, você deve especificar os parâmetros de acordo em seu arquivo 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
fonte
1
não é, MONGO_INITDB_ROOT_USERNAMEmas MONGO_INITDB_ROOT_PASSWORDno caso de a password.
Kamil Witkowski
0

Aqui está como você pode fazer no Spring Boot 2.0 criando um MongoClient personalizado adicionando Fornecendo mais controle para conexão,

Siga o link do github para obter o código-fonte 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
fonte
Veja como? O quê - adicionando uma classe? O que é JPA? Onde estão suas importações neste arquivo? Esta é uma resposta incompleta, na melhor das hipóteses.
barrypicker