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
以上内容就是通过重写spring data mongodb的抽象类实现的去掉“_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”字段属性的方案,欢迎讨论指正!
相关文章推荐
- How to remove k__BackingField from Json data
- How to Properly Remove Datastore or LUN from ESXi 5.x hosts
- How to Properly Remove Datastore or LUN from ESXi 5.x hosts
- How to remove k__BackingField from Json data
- Maven使用package打包Spring Boot时出现:Unable to find a single main class from the following candidates的问题解决
- SpringBoot学习之一 Unable to find a single main class from the following candidates
- Springboot repackage failed: Unable to find a single main class from the following candidates
- How to create a hex dump from binary data in C++
- How to recover deleted data from SQL Server 暴强
- spring-data-mongodb 去除 _class 列
- How to access UI controls from a user defined class (CFormView based SDI application)
- How To Remove The Advertisement From Android APK
- How to remove a line from a file in java?
- how to separate index from data tablespace
- How to modify the uboot environment from userspace
- How to check the java compiler version from a java class file?
- How to load and execute Thread class when spring configuration loaded (如何在读取spring配置时自启动线程类)
- How to manually remove an infected file from your computer
- How To Build Compelling Stories From Your Data Sets
- How to extract data from ContentHolder in Windc...