1.MongoTemplate配置

环境介绍

Java环境下简单的Spring工程

<dependencies>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-mongodb</artifactId>
            <version>3.0.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>bson</artifactId>
            <version>4.0.4</version>
        </dependency>
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongodb-driver-core</artifactId>
            <version>4.0.4</version>
        </dependency>
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongodb-driver-sync</artifactId>
            <version>4.0.4</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
        </dependency>
        <!--        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongo-java-driver</artifactId>
            <version>3.12.5</version>
        </dependency>-->
    </dependencies>

注入必要的Bean

在学习使用mongoTemplate的时候,一定要注意spring版本和mongodb-driver的版本,在mongodb-driver早些版本的时候,使用的是Mongo代表一个客户端

com.mongodb.Mongo

但现在的较新版本已经删除该类,与之代替的是MongoClient

com.mongodb.client.MongoClient;

所以,使用的spring-data-mongodb也必须是支持的较新的mongo-driver的。
现在开始正式写配置(如下是基于java的配置)

@Configuration
public class MongoConfig {

   @Bean
   public MongoClientFactoryBean mongoClientFactoryBean() {
        MongoClientFactoryBean factoryBean = new MongoClientFactoryBean();
        factoryBean.setHost("192.168.1.100");
        factoryBean.setPort(27017);
        return factoryBean;
    }
    @Bean
    public MongoOperations mongoTemplate(MongoClient mongoClient) {
        return new MongoTemplate(mongoClient, "studydb");
    }
}

MongoClientFactoryBean也就是旧版本的MongoFactoryBean,官方解释说“可以更方便的配置MongoClient"。也就是说,在配置MongoClientFactoryBean的时候会自动装配一个MongoClient在容器里面,因此在装配mongoTemplate的收可以直接将MongoClient作为参数传入。
当然在其他地方使用MongoClient,就只需要@Autowired。

测试

package mongod;

import com.mongodb.client.MongoClients;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.data.mongodb.core.MongoTemplate;

public class MongoMain {
    public static void main(String[] args) {
        ApplicationContext ioc = new AnnotationConfigApplicationContext(MongoConfig.class);
        MongoTemplate mongoTemplate = ioc.getBean(MongoTemplate.class);
        Person person = new Person(null, "JayHoo", 21, "四川省绵阳市");
        mongoTemplate.insert(person);
    }
}

其中使用到一个Person的类,代码简单如下

@Document(collection = "person")
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Data
public class Person {
    @Id
    private String id;
    private String name;
    private int age;
    @Transient
    private String address;
}

执行的目的就是在数据库里插入一条person记录,效果如图

执行效果图

注意: 在配置实体类时,address上使用@Transient注解,就表明address不会被序列化到mongodb数据库中。

填坑记

之前用springBoot根本不会考虑这些问题,谁叫我喜欢折腾自己呢~

1.导错包

导错包

根据方法栈显示,在MongoTemplate的1442行调用了一个方法,这个方法就是

com.mongod.client.MongoCollection.insertOne()

这里得提一句,网络上说java链接mongodb需要三个包,分别是

mongo-java-driver
mongodb-driver-core
bson

其实这三个包足够连mongodb了,但是spring做mongotemplate的时候,并没选择第一个包,取而代之的是

mongo-java-sync

这一点可以从SpringBoot的依赖中可以看出,
springboot的自动装配依赖

因此将mongo-java-driver换成mongodb-driver-sync就可以和Spring整合了。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容