首先说一下背景,因为其他的一个web工程有使用mongo,我想着给另外一个工程把mongo也加过来吧。也是最近做一个发送 丘比特信 的需求,觉得这个信应该是存到 mongodb。结果拿过来遇到了很大的坑,也是对版本对原理不了解吧。   

下面介绍一下引入的过程及遇到的坑和解决方案:

第一步,先说版本:

spring boot 的版本

<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>

所以mongodb的版本也对应:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
    <version>2.3.1.RELEASE</version>
</dependency>

说一下涉及到mongo的一些类对应版本:

spring-data-mongodb-3.0.1.RELEASE

spring-boot-starter-data-mongodb-2.3.1.RELEASE

mongodb-driver-sync-4.0.4

mongodb-driver-core-4.0.4

bson-4.0.4

第二步,就是代码:

刚开始的想法是拿来即用

@Autowired
private MongoTemplate mongoTemplate;

注意:程序都起不来,因为找不到 MongoTemplate

然后自己通过@Bean创建MongoTemplate

@Bean
    public MongoClient mongoClient() {
        String connectionUserName = "";
        String connectionUserInfo = "";
        try {
            connectionUserName = URLEncoder.encode("XXX","UTF-8");
            connectionUserInfo = URLEncoder.encode("XXXXXX","UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        String connectionString = "mongodb://"+connectionUserName+":"+connectionUserInfo+"@XXXXXXXXX:XXXXXXXXX/XXXXXXXXX?authMechanism=SCRAM-SHA-1";

        return MongoClients.create(connectionString);
    }

    @Bean
    public MongoTemplate mongoTemplate() {
        return new MongoTemplate(mongoClient(), "XXXXXXXXX");
    }

注意:

网上的很多实例,连接串都是没有用户名和密码的。

"mongodb://username:password@host:port/dbname?authMechanism=SCRAM-SHA-1";

我们的密码是含有@符号,所以要encode,

username:password,这个中间的冒号一定不能encode,在这反复异常。冒号encode,提示找不到密码, 冒号不encode,提示用户名或者密码包含@或者冒号。

然后是禁用MongoDB数据库自动化配置:

@SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class}) //刚开始只排除第一个类,反复报异常

第三步,使用

Query query = new Query(Criteria.where("baseCountryCode").is(country));
        List<BeforeVipCupidMongo> cupidList = mongoTemplate.find(query, BeforeVipCupidMongo.class);

总结:

  1. 版本对照,spring boot 的版本 和 mongo 的版本;
  2. spring boot 禁用 mongodb 数据库自动化配置;
  3. 如果自定义MongoTemplate,需要注意 connectionString,密码如果含有@或者:,一定要encode,而username:password这个之间的:是不能encode的;
  4. 操作mongo的方式

 参考资料:

SpringBoot与MongoDB版本对照参考_mongodb和springboot版本_一恍过去的博客-CSDN博客

https://www.cnblogs.com/huifeidezhuzai/p/16352608.html

https://www.cnblogs.com/zeussbook/p/15330735.html 

详解SpringBoot整合MongoDB技术分解_独善其身有始有终的技术博客_51CTO博客

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐