Springboot集成Mongodb

前言

Mongodb如何新建用户?

  1. 安装好mongo首先修改配置文件中etc/mongo.conf中auth配置为false,然后启动服务,这一步目的是不做权限验证避免第一次新建用户提示权限错误。

  1. 登入后使用use dbName新建数据库

  1. 新建用户。这里roles中的dbName和上一步必须保持一致

db.createUser({user:"userName",pwd:"userPassword",roles:[{role:"readWrite",db:"dbName"}]})
  1. (可选)通过insert 的方式新建文档。这里新建了一个名为『message』的文档

db.message.insert({title: 'test11', 
    info: '12345',
})
  1. 修改配置文件中etc/mongo.conf中auth配置为true,然后重启服务

Springboot集成Mongodb

  1. pom文件引入依赖


    org.springframework.boot
    spring-boot-starter-data-mongodb
  1. 配置文件增加相关配置信息

spring.data.mongodb.host=localhost
spring.data.mongodb.port=2022
spring.data.mongodb.username=userName
spring.data.mongodb.password=userPassword
spring.data.mongodb.database=dbName
  1. 使用MongoTemplate相关API就可以操作了。具体API的使用教程很多,这不记录了

记录首次首次引入出现的问题

  1. 操作时提示权限验证失败

The full response is {“ok”: 0.0, “errmsg”: “Authentication failed.”, “code”: 18, “codeName”: “AuthenticationFailed”}.

出现这个错误,一般有几种可能:

  1. 登录用户和所要操作的数据库权限不匹配。即该用户没有操作该数据库的权限,尝试修改权限,或者新建数据库,然后新建用户

  1. 密码配置错误。如果你需要自定义相关配置,比如配置文件中密码为密文,创建客户端时需要先解密再创建。类似这种操作需要自己手写相关的初始化逻辑。如果无需任何修改,那就检查你的密码,大概率是写错了。

自定义配置的时候有几个小问题:

  1. 使用MongoProperties读取的配置密码,类型为char[]。为避免麻烦示例中直接手动引入然后处理

  1. 这个示例中的使用方法和对应的配置文件是保持一致的。即不配置spring.data.mongodb.uri=mongodb://xxxx。如果使用spring.data.mongodb.uri配置连接串信息,就无需单独配置username等。但是这里如果还需要自己解密密码或者其他自定义操作,可能需要自己解析uri再处理了。

  1. 其次,如果一定要使用spring.data.mongodb.uri这种配置方式,需要配置为:mongodb://root:[email protected]:27017/db_name?authSource=admin。这里最后的authSource=admin很关键,指定具有权限的数据库。不指定的话会报如开头所说的错误

@Configuration
@Primary
public class MongoConfiguration {
 
    @Value("${spring.data.mongodb.password}")
    public String PASSWORD;


    @Bean("mongoProperties")
    @Primary
    @ConfigurationProperties(prefix = "spring.data.mongodb")
    public MongoProperties masterMongoProperties() {
        return new MongoProperties();
    }


    /**
     * 连接池自定义配置处理
     *
     * @return
     */
    @Bean("mongoDbFactory")
    @Primary
    public MongoDbFactory mongoDatabaseFactory(@Qualifier("mongoProperties") MongoProperties properties) {
        String password = PASSWORD;
        password="解密操作";
        properties.setPassword(password.toCharArray());
        MongoCredential credential = MongoCredential.createCredential(properties.getUsername(),
                properties.getDatabase(),
                password.toCharArray());
        ServerAddress serverAddress = new ServerAddress(properties.getHost(), properties.getPort());
        MongoDriverInformation info = MongoDriverInformation.builder().build();
        MongoClientSettings build = MongoClientSettings.builder()
                .applyToClusterSettings(builder -> builder.hosts(Collections.singletonList(serverAddress)))
                .credential(credential).build();
        MongoClient mongoClient = new MongoClientImpl(build, info);
        return new SimpleMongoClientDbFactory(mongoClient, properties.getDatabase());
    }


    @Bean("mongoTemplate")
    @Primary
    public MongoTemplate mongoTemplate(@Qualifier("mongoDbFactory") MongoDbFactory mongoDatabaseFactory) {
        MongoTemplate mongoTemplate = new MongoTemplate(mongoDatabaseFactory);
        MappingMongoConverter mongoMapping = (MappingMongoConverter) mongoTemplate.getConverter();
        mongoMapping.setTypeMapper(new DefaultMongoTypeMapper(null));
        mongoMapping.afterPropertiesSet();
        return mongoTemplate;
    }
}

踩坑记录

你可能感兴趣的:(SpringBoot,mongodb,spring,boot,数据库)