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?

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;

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:secret@mongo1.example.com:12345

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

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;
    }
}

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>

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;
    }} 

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.