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

来源:互联网 发布:origin有没有mac版 编辑:程序博客网 时间:2024/06/06 03:21

摘要:在使用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",噢,原来问题在这里呢



二:上面分析清楚问题的原因后,下面我们来看怎么实现在用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 */@Configurationpublic 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”字段属性的方案,欢迎讨论指正!


原创粉丝点击