Spring Boot MongoDB How to remove _class from spring data mongodb collection

摘要:在使用Spring Boot整合Mongodb的过程中,在做insert对象的时候,在Collection中会出现一个_class字段属性,出现这个问题的原因是在调用mongoTemplate的insert方法时, spring-data-mongodb的TypeConverter会自动给document添加一个_class属性, 值是你保存的类名. 这种设计并没有什么坏处. spring-data-mongodb是为了在把document转换成Java对象时能够转换到具体的子类. 但有时候我们并不希望出现这个字段, 主要是看上去会比较"烦". 可以通过设置MappingMongoConverter的MongoTypeMapper来解决这个问题。


一:下面我们通过查询MappingMongoConverter.java源码看下究竟是怎么回事

1.首先查找MappingMongoConverter类,如下图所示:


2.通过查看,发现该类中有一个MongoTypeMapper对象,该对象就是实现mongodb中实体和collection对象映射的关键类,如下图:



3.点进去DefaultMongoTypeMapper.DEFAULT_TYPE_KEY,发现该默认值为:"_class",噢,原来问题在这里呢



扫描二维码关注公众号,回复: 899594 查看本文章

二:上面分析清楚问题的原因后,下面我们来看怎么实现在用spring data mongodb保存数据的时候,在collection里面不要_class字段属性呢,这里需要查看下spring data mongodb的源码,查找org.springframework.data.mongodb.config目录下的AbstractMongoConfiguration类,你会发现创建MongoTemplate对象的时候,需要调用mappingMongoConverter()方法,点进去该方法,你会发现该方法里面有MappingMongoConverter,那么我们可以通过自定义该抽象类,并重写这个方法,实现去掉_class的功能,如下图:



三:上面都行分析,最后给出我这边的实现方案

1.新建一个自定义mongodb配置类ImMongoConfiguration,该类继承AbstractMongoConfiguration类,并重写mappingMongoConverter(),通过该设置方法里面的MappingMongoConverter对象的typeMapper值,去掉_class

2.ImMongoConfiguration.java

package boss.platform.im.config;

import boss.framework.mongodb.config.MongodbConfig;
import com.mongodb.Mongo;
import com.mongodb.MongoClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.config.AbstractMongoConfiguration;
import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;

/**
 * 描述:How to remove _class from spring data mongodb collection
 * <p>
 * Author: 赵新国
 * Date: 2017/12/8 12:10
 */
@Configuration
public class ImMongoConfiguration extends AbstractMongoConfiguration {

    @Autowired
    private MongodbConfig mongodbConfig;

    @Override
    protected String getDatabaseName() {
        return mongodbConfig.getDatabase();
    }

    @Override
    public Mongo mongo() throws Exception {
        return new MongoClient(mongodbConfig.getHost(), mongodbConfig.getPort());
    }

    // 都只是为了去除"_class"字段
    @Bean
    @Override
    public MappingMongoConverter mappingMongoConverter() throws Exception {
        MappingMongoConverter mappingMongoConverter = super.mappingMongoConverter();
        mappingMongoConverter.setTypeMapper(new DefaultMongoTypeMapper(null));
        return mappingMongoConverter;
    }

}
解释一下上面的自定义配置类,其中的MongodbConfig类,是我们实现的通过disconfig配置中心获取配置的实例,你也可以使用spring的@Value的方式把database,host,port注入进来,改成你自己的配置,我这里使用的disconfig配置的方式,没有使用spring默认注入的方式,当然你也可以直接写死这三个地方,如下图:



以上内容就是通过重写spring data mongodb的抽象类实现的去掉“_class”字段属性的方案,欢迎讨论指正!


猜你喜欢

转载自blog.csdn.net/sxdtzhaoxinguo/article/details/78770211