Spring Boot i jak skonfigurować szczegóły połączenia z MongoDB?

90

Będąc nowym w Spring Boot, zastanawiam się, jak mogę skonfigurować szczegóły połączenia dla MongoDB. Wypróbowałem normalne przykłady, ale żaden nie obejmuje szczegółów połączenia.

Chcę określić bazę danych, która będzie używana, oraz adres URL / port hosta, na którym działa MongoDB.

Jakieś wskazówki lub wskazówki?

Marco
źródło

Odpowiedzi:

106

Cytując Boot Docs :

Możesz ustawić spring.data.mongodb.uriwłaściwość, aby zmienić adres URL, lub alternatywnie określić host/port. Na przykład możesz zadeklarować w swoim application.properties:

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

Wszystkie dostępne opcje spring.data.mongodbprzedrostka to pola 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
źródło
Hej, czy zrobiłbym to samo dla normalnej aplikacji internetowej używającej Spring Boot? Gdzie mogę znaleźć plik application.properties?
Theo
Musisz napisać to samodzielnie, jeśli nie chcesz polegać na domyślnych opcjach: docs.spring.io/spring-boot/docs/current/reference/html/…
Artem Bilan
Zauważ, że obecnie występuje problem, jeśli chcesz ustawić pole hasła, ponieważ jest to znak []. Zamiast tego użyj pola uri. Zobacz dolną część tego raportu o błędzie: github.com/spring-projects/spring-boot/issues/536
grahamrb
Cześć, jestem całkiem nowy w Spring Boot. Gdzie ustawiamy te konfiguracje? Po prostu przekaż jako argumenty lub gdzieś go ustaw?
Siddharth
Proszę przeczytać podręcznik w tej sprawie: docs.spring.io/spring-boot/docs/current/reference/html/…
Artem Bilan
32

spring.data.mongodb.hosti spring.data.mongodb.portnie są obsługiwane, jeśli używasz sterownika Mongo 3.0 Java . W takich przypadkach spring.data.mongodb.urinależy podać całą konfigurację, na przykład:

spring.data.mongodb.uri=mongodb://user:[email protected]:12345
Ali Dehghani
źródło
12
Co jeśli nie masz użytkownika ani hasła?
Jesse
@Jesse w tym przypadku jest w porządku, domyślnie mongo nie wymaga żadnego uwierzytelnienia, więc połączenie będzie działać w tym przypadku.
jmojico
Czy jest jakaś opcja automatycznego ponownego połączenia w spring.data.mongodb.uri?
P Satish Patro
czy będzie działać dla samodzielnej aplikacji danych Spring?
Sumanth Varada
20

W projekcie Maven utwórz plik src/main/resources/application.ymlo następującej zawartości:

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 automatycznie użyje tego pliku do skonfigurowania aplikacji. Następnie możesz uruchomić aplikację do rozruchu wiosennego za pomocą profilu integracji (i użyć lokalnej bazy danych MongoDB)

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

lub z profilem produkcyjnym (i użyj swojej produkcyjnej MongoDB)

java -jar -Dspring.profiles.active=production your-app.jar
asmaier
źródło
Czy jest jakaś opcja automatycznego ponownego połączenia w spring.data.mongodb.uri?
P Satish Patro
16

Możesz zdefiniować więcej szczegółów, rozszerzając 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
źródło
Gdzie jest określona nazwa użytkownika i hasło? Daje nieautoryzowany wyjątek, gdy po prostu zdefiniujemy go w pliku applicaiton.properties, a następnie rozszerzymy AbstractMongoConfiguration.
Noor Syed
Będzie to application.properties
Mari Murotani
Czy dobrze jest używać do tego zmiennej profilu? if(profileActive=="dev"){ return new Fongo(getDatabaseName()).getMongo();} else { return new MongoClient(url, port); }
anat0lius
13

Należy również zauważyć, że MongoDB ma pojęcie „ bazy danych uwierzytelniania ”, która może różnić się od bazy danych, z którą się łączysz. Na przykład, jeśli używasz oficjalnego obrazu Dockera dla Mongo i określisz zmienne środowiskowe MONGO_INITDB_ROOT_USERNAME i MONGO_INITDB_ROOT_PASSWORD , użytkownik zostanie utworzony w bazie danych „ admin ”, która prawdopodobnie nie jest bazą danych, której chcesz użyć. W takim przypadku należy odpowiednio określić parametry w pliku application.properties za pomocą:

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
źródło
1
tak nie jest, MONGO_INITDB_ROOT_USERNAMEale MONGO_INITDB_ROOT_PASSWORDw przypadku password.
Kamil Witkowski
0

Oto, jak możesz to zrobić w Spring Boot 2.0 , tworząc niestandardowe dodawanie MongoClient. Zapewnienie większej kontroli nad połączeniem,

Aby uzyskać pełny kod źródłowy, skorzystaj z łącza github

@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
źródło
Oto jak? Co - dodawanie klasy? Co to jest JPA? Gdzie są twoje importy w tym pliku? W najlepszym przypadku jest to niepełna odpowiedź.
barrypicker