Boot Musim Semi dan bagaimana cara mengonfigurasi detail koneksi ke MongoDB?

90

Menjadi baru di Spring Boot Saya bertanya-tanya tentang bagaimana saya dapat mengonfigurasi detail koneksi untuk MongoDB. Saya telah mencoba contoh normal tetapi tidak ada yang mencakup detail koneksi.

Saya ingin menentukan database yang akan digunakan dan url / port host yang menjalankan MongoDB.

Ada petunjuk atau tip?

Marco
sumber

Jawaban:

106

Hanya mengutip Boot Docs :

Anda dapat menyetel spring.data.mongodb.uriproperti untuk mengubah url, atau sebagai alternatif menentukan a host/port. Misalnya, Anda dapat mendeklarasikan hal berikut di application.properties:

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

Semua opsi yang tersedia untuk spring.data.mongodbawalan adalah bidang 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
sumber
Hai, apakah saya akan melakukan hal yang sama untuk aplikasi web biasa menggunakan Spring boot? Di mana saya dapat menemukan file application.properties?
Theo
Anda perlu menulisnya sendiri, jika Anda tidak ingin bergantung pada opsi default: docs.spring.io/spring-boot/docs/current/reference/html/…
Artem Bilan
Perhatikan bahwa saat ini ada masalah jika Anda ingin menyetel bidang sandi karena ini adalah karakter []. Sebagai gantinya gunakan bidang uri. Lihat bagian bawah laporan bug ini: github.com/spring-projects/spring-boot/issues/536
grahamrb
Hai, saya baru mengenal Spring Boot. Dimana kita mengatur konfigurasi tersebut? Berikan saja sebagai argumen atau atur di suatu tempat?
Siddharth
Silakan, baca Manual Referensi tentang masalah ini: docs.spring.io/spring-boot/docs/current/reference/html/…
Artem Bilan
32

spring.data.mongodb.hostdan spring.data.mongodb.porttidak didukung jika Anda menggunakan driver Mongo 3.0 Java . Dalam kasus seperti itu, spring.data.mongodb.uriharus digunakan untuk menyediakan semua konfigurasi, seperti ini:

spring.data.mongodb.uri=mongodb://user:[email protected]:12345
Ali Dehghani
sumber
12
Bagaimana jika Anda tidak memiliki pengguna atau kata sandi?
Jesse
@Jesse dalam hal ini baik-baik saja, secara default mongo tidak memerlukan otentikasi apa pun sehingga koneksi akan berfungsi dalam kasus itu.
jmojico
Apakah ada opsi untuk memberikan koneksi otomatis di spring.data.mongodb.uri?
P Satish Patro
Akankah itu bekerja untuk aplikasi data pegas mandiri?
Sumanth Varada
20

Dalam proyek maven buat file src/main/resources/application.yml dengan konten berikut:

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 secara otomatis akan menggunakan file ini untuk mengkonfigurasi aplikasi Anda. Kemudian Anda dapat memulai aplikasi boot musim semi Anda dengan profil integrasi (dan menggunakan MongoDB lokal Anda)

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

atau dengan profil produksi (dan menggunakan MongoDB produksi Anda)

java -jar -Dspring.profiles.active=production your-app.jar
asmaier
sumber
Apakah ada opsi untuk memberikan koneksi otomatis di spring.data.mongodb.uri?
P Satish Patro
16

Anda dapat menentukan detail selengkapnya dengan memperluas 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
sumber
Di mana nama pengguna dan kata sandi ditentukan? Ini memberikan pengecualian yang tidak sah, ketika kita hanya mendefinisikannya di applaiton.properties dan kemudian memperluas AbstractMongoConfiguration.
Noor Syed
Ini akan berada di dalam application.properties
Mari Murotani
Apakah benar menggunakan variabel profil untuk melakukan ini? if(profileActive=="dev"){ return new Fongo(getDatabaseName()).getMongo();} else { return new MongoClient(url, port); }
anat0lius
13

Penting juga untuk diperhatikan bahwa MongoDB memiliki konsep " database otentikasi ", yang bisa berbeda dari database yang Anda sambungkan. Misalnya, jika Anda menggunakan image Docker resmi untuk Mongo dan menentukan variabel lingkungan MONGO_INITDB_ROOT_USERNAME dan MONGO_INITDB_ROOT_PASSWORD , pengguna akan dibuat di database ' admin ', yang mungkin bukan database yang ingin Anda gunakan. Dalam kasus ini, Anda harus menentukan parameter yang sesuai pada file application.properties Anda menggunakan:

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
sumber
1
itu tidak MONGO_INITDB_ROOT_USERNAMEtetapi MONGO_INITDB_ROOT_PASSWORDdalam kasus a password.
Kamil Witkowski
0

Berikut adalah Bagaimana Anda dapat melakukannya di Spring Boot 2.0 dengan membuat MongoClient kustom menambahkan Menyediakan lebih banyak kontrol untuk Koneksi,

Ikuti Tautan github untuk Kode Sumber Lengkap

@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
sumber
Begini caranya? Apa - menambahkan kelas? Apa itu JPA? Di mana impor Anda dalam file ini? Ini adalah jawaban yang paling tidak lengkap.
barrypicker