您的位置:首页 > 数据库 > Mongodb

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

2017-12-11 11:10 806 查看
摘要:在使用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
*/
@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”字段属性的方案,欢迎讨论指正!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Spring Boot mongodb