Spring Boot và cách cấu hình chi tiết kết nối với MongoDB?


89

Mới sử dụng Spring Boot, tôi đang băn khoăn về cách cấu hình chi tiết kết nối cho MongoDB. Tôi đã thử các ví dụ bình thường nhưng không có gì bao gồm các chi tiết kết nối.

Tôi muốn chỉ định cơ sở dữ liệu sẽ được sử dụng và url / cổng của máy chủ chạy MongoDB.

Bất kỳ gợi ý hoặc lời khuyên?

Câu trả lời:


105

Chỉ để trích dẫn Tài liệu khởi động :

Bạn có thể đặt thuộc spring.data.mongodb.uritính để thay đổi url hoặc chỉ định một cách khác host/port. Ví dụ: bạn có thể khai báo những điều sau trong application.properties:

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

Tất cả các tùy chọn có sẵn cho spring.data.mongodbtiền tố là các trường 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;

Này, tôi có làm tương tự cho một ứng dụng web bình thường sử dụng Spring boot không? Tôi có thể tìm thấy tệp application.properties ở đâu?
Theo

Bạn cần phải viết nó cho mình, nếu bạn không muốn dựa vào tùy chọn mặc định: docs.spring.io/spring-boot/docs/current/reference/html/...
Artem Bilan

Lưu ý rằng hiện có một vấn đề nếu bạn muốn đặt trường mật khẩu vì nó là một ký tự []. Thay vào đó, hãy sử dụng trường tiểu. Xem dưới cùng của báo cáo lỗi này: github.com/spring-projects/spring-boot/issues/536
grahamrb

Xin chào, tôi khá mới sử dụng Spring Boot. Chúng ta đặt các cấu hình đó ở đâu? Chỉ cần chuyển nó dưới dạng đối số hoặc đặt nó ở đâu đó?
Siddharth

Vui lòng đọc Sách hướng dẫn tham khảo về vấn đề này: docs.spring.io/spring-boot/docs/current/reference/html/…
Artem Bilan,

31

spring.data.mongodb.hostspring.data.mongodb.portkhông được hỗ trợ nếu bạn đang sử dụng trình điều khiển Java Mongo 3.0 . Trong những trường hợp như vậy, spring.data.mongodb.urinên được sử dụng để cung cấp tất cả các cấu hình, như sau:

spring.data.mongodb.uri=mongodb://user:secret@mongo1.example.com:12345

12
Điều gì xảy ra nếu bạn không có người dùng hoặc mật khẩu?
Jesse

@Jesse trong trường hợp đó là tốt, theo mặc định mongo không yêu cầu bất kỳ xác thực nào nên kết nối sẽ hoạt động trong trường hợp đó.
jmojico

Có tùy chọn nào để cung cấp kết nối tự động trong spring.data.mongodb.uri không?
P Satish Patro

nó hoạt động cho ứng dụng dữ liệu mùa xuân độc lập?
Sumanth Varada

20

Trong một dự án maven, hãy tạo một tệp src/main/resources/application.ymlcó nội dung sau:

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 sẽ tự động sử dụng tệp này để cấu hình ứng dụng của bạn. Sau đó, bạn có thể khởi động ứng dụng khởi động mùa xuân của mình bằng cấu hình tích hợp (và sử dụng MongoDB cục bộ của bạn)

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

hoặc với hồ sơ sản xuất (và sử dụng MongoDB sản xuất của bạn)

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

Có tùy chọn nào để cung cấp kết nối tự động trong spring.data.mongodb.uri không?
P Satish Patro

16

Bạn có thể xác định thêm chi tiết bằng cách mở rộng 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;
    }
}

Tên người dùng và mật khẩu được chỉ định ở đâu? Nó cho phép đào trái phép, khi chúng tôi chỉ định nghĩa nó trong applicationaiton.properties và sau đó mở rộng AbstractMongoConfiguration.
Noor Syed

Nó sẽ là bên application.properties
Mari Murotani

Sử dụng biến hồ sơ để làm điều này có đúng không? if(profileActive=="dev"){ return new Fongo(getDatabaseName()).getMongo();} else { return new MongoClient(url, port); }
anat0lius

12

Cũng cần lưu ý rằng MongoDB có khái niệm " cơ sở dữ liệu xác thực ", có thể khác với cơ sở dữ liệu bạn đang kết nối. Ví dụ: nếu bạn sử dụng hình ảnh Docker chính thức cho Mongo và chỉ định các biến môi trường MONGO_INITDB_ROOT_USERNAMEMONGO_INITDB_ROOT_PASSWORD , một người dùng sẽ được tạo trên cơ sở dữ liệu ' quản trị ', đây có thể không phải là cơ sở dữ liệu bạn muốn sử dụng. Trong trường hợp này, bạn nên chỉ định các tham số tương ứng trên tệp application.properties của mình bằng cách sử dụng:

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
nó không phải MONGO_INITDB_ROOT_USERNAMEnhưng MONGO_INITDB_ROOT_PASSWORDtrong trường hợp của a password.
Kamil Witkowski

0

Đây là Cách bạn có thể làm trong Spring Boot 2.0 bằng cách tạo thêm MongoClient tùy chỉnh Cung cấp nhiều quyền kiểm soát hơn cho Kết nối,

Vui lòng theo liên kết github để biết mã nguồn đầy đủ

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

Đây là cách làm? Cái gì - thêm một lớp? JPA là gì? Nhập của bạn ở đâu trong tệp này? Đây là một câu trả lời không đầy đủ tốt nhất.
barrypicker
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.