Spring Boot และวิธีกำหนดค่ารายละเอียดการเชื่อมต่อกับ MongoDB?


93

เป็นมือใหม่สำหรับ Spring Boot ฉันสงสัยว่าจะกำหนดค่ารายละเอียดการเชื่อมต่อสำหรับ MongoDB ได้อย่างไร ฉันได้ลองใช้ตัวอย่างปกติแล้ว แต่ไม่มีรายละเอียดการเชื่อมต่อเลย

ฉันต้องการระบุฐานข้อมูลที่จะใช้และ url / port ของโฮสต์ที่รัน MongoDB

คำแนะนำหรือคำแนะนำใด ๆ ?

คำตอบ:


108

เพียงเพื่ออ้างถึงBoot Docs :

คุณสามารถตั้งค่าspring.data.mongodb.uriคุณสมบัติเพื่อเปลี่ยน url หรือระบุกhost/port. ตัวอย่างเช่นคุณอาจประกาศสิ่งต่อไปนี้ในapplication.properties:

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

ตัวเลือกที่มีอยู่ทั้งหมดสำหรับspring.data.mongodbคำนำหน้าคือฟิลด์ของ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;

เฮ้ฉันจะทำเช่นเดียวกันกับเว็บแอปทั่วไปโดยใช้ Spring boot หรือไม่ ฉันจะหาไฟล์ application.properties ได้ที่ไหน
ธีโอ

คุณต้องเขียนเองถ้าคุณไม่ต้องการพึ่งพาตัวเลือกเริ่มต้น: docs.spring.io/spring-boot/docs/current/reference/html/…
Artem Bilan

โปรดทราบว่าขณะนี้มีปัญหาหากคุณต้องการตั้งค่าฟิลด์รหัสผ่านเนื่องจากเป็นอักขระ [] ใช้ฟิลด์ uri แทน ดูด้านล่างของรายงานข้อบกพร่องนี้: github.com/spring-projects/spring-boot/issues/536
grahamrb

สวัสดีฉันเพิ่งเริ่มใช้ Spring Boot เราตั้งค่าการกำหนดค่าเหล่านั้นไว้ที่ไหน? เพียงแค่ส่งเป็นข้อโต้แย้งหรือตั้งไว้ที่ไหนสักแห่ง?
Siddharth

โปรดอ่านคู่มืออ้างอิงในเรื่อง: docs.spring.io/spring-boot/docs/current/reference/html/…
Artem Bilan

34

spring.data.mongodb.hostและspring.data.mongodb.portยังไม่ได้รับการสนับสนุนถ้าคุณกำลังใช้ไดรเวอร์ Mongo 3.0 Java ในกรณีเช่นนี้spring.data.mongodb.uriควรใช้เพื่อจัดเตรียมการกำหนดค่าทั้งหมดดังนี้:

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

12
จะเกิดอะไรขึ้นหากคุณไม่มีผู้ใช้หรือรหัสผ่าน?
Jesse

@Jesse ในกรณีนั้นมันก็ดีโดยค่าเริ่มต้น mongo ไม่ต้องการการรับรองความถูกต้องใด ๆ ดังนั้นการเชื่อมต่อจะทำงานในกรณีนั้น
jmojico

มีตัวเลือกใดในการให้การเชื่อมต่ออัตโนมัติใน spring.data.mongodb.uri หรือไม่
P Satish Patro

มันใช้งานได้กับแอปพลิเคชันข้อมูลสปริงแบบสแตนด์อโลนหรือไม่
Sumanth Varada

22

ในโครงการ maven สร้างไฟล์ที่src/main/resources/application.ymlมีเนื้อหาต่อไปนี้:

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 จะใช้ไฟล์นี้โดยอัตโนมัติเพื่อกำหนดค่าแอปพลิเคชันของคุณ จากนั้นคุณสามารถเริ่มแอปพลิเคชันสปริงบูตได้ด้วยโปรไฟล์การรวม (และใช้ MongoDB ในพื้นที่ของคุณ)

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

หรือกับโปรไฟล์การผลิต (และใช้ MongoDB การผลิตของคุณ)

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

มีตัวเลือกใดในการให้การเชื่อมต่ออัตโนมัติใน spring.data.mongodb.uri หรือไม่
P Satish Patro

16

คุณสามารถกำหนดรายละเอียดเพิ่มเติมได้โดยการขยาย 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;
    }
}

ชื่อผู้ใช้และรหัสผ่านระบุไว้ที่ไหน? มันให้การตัดตอนโดยไม่ได้รับอนุญาตเมื่อเรากำหนดมันใน applicaiton.properties แล้วขยาย AbstractMongoConfiguration
Noor Syed

มันจะอยู่ใน application.properties
Mari Murotani

การใช้ profile variable เพื่อทำสิ่งนี้ถูกต้องหรือไม่ if(profileActive=="dev"){ return new Fongo(getDatabaseName()).getMongo();} else { return new MongoClient(url, port); }
anat0lius

15

สิ่งสำคัญที่ควรทราบคือ MongoDB มีแนวคิดของ " ฐานข้อมูลการพิสูจน์ตัวตน " ซึ่งอาจแตกต่างจากฐานข้อมูลที่คุณกำลังเชื่อมต่ออยู่ ตัวอย่างเช่นหากคุณใช้อิมเมจ Docker อย่างเป็นทางการสำหรับ Mongoและระบุตัวแปรสภาพแวดล้อม MONGO_INITDB_ROOT_USERNAMEและMONGO_INITDB_ROOT_PASSWORDผู้ใช้จะถูกสร้างขึ้นบนฐานข้อมูล " admin " ซึ่งอาจไม่ใช่ฐานข้อมูลที่คุณต้องการใช้ ในกรณีนี้คุณควรระบุพารามิเตอร์ตามไฟล์application.propertiesของคุณโดยใช้:

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
ไม่ใช่MONGO_INITDB_ROOT_USERNAMEแต่MONGO_INITDB_ROOT_PASSWORDในกรณีของไฟล์password.
Kamil Witkowski

0

นี่คือวิธีที่คุณสามารถทำได้ในSpring Boot 2.0โดยการสร้าง MongoClient แบบกำหนดเองเพิ่มให้การควบคุมการเชื่อมต่อมากขึ้น

โปรดติดตาม ลิงก์ github เพื่อดู Source Code แบบเต็ม

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

มีวิธีการอย่างไร อะไร - การเพิ่มชั้นเรียน? JPA คืออะไร? การนำเข้าของคุณอยู่ที่ไหนในไฟล์นี้ นี่เป็นคำตอบที่ไม่สมบูรณ์ที่ดีที่สุด
barrypicker
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.