調(diào)用mongoTemplate的save方法時(shí), spring-data-mongodb的TypeConverter會(huì)自動(dòng)給document添加一個(gè)_class屬性, 值是你保存的類(lèi)名. 這種設(shè)計(jì)并沒(méi)有什么壞處. spring-data-mongodb是為了在把document轉(zhuǎn)換成Java對(duì)象時(shí)能夠轉(zhuǎn)換到具體的子類(lèi). 但有時(shí)候我們并不希望出現(xiàn)這個(gè)字段, 主要是看上去會(huì)比較"煩". 可以通過(guò)設(shè)置MappingMongoConverter的MongoTypeMapper來(lái)解決這個(gè)問(wèn)題.
spring的配置文件
這 里關(guān)鍵的類(lèi)org.devside.mongodb.MongoConverterEnhanceFactoryBean. 其實(shí)沒(méi)做什么特別的事情. 就是把spring-data的MappingMongoConverter拿過(guò)來(lái),然后把TypeMapper設(shè)置一下.
DefaultMongoTypeMapper類(lèi)的構(gòu)造函數(shù)的第一個(gè)參數(shù)是Type在MongoDB中名字. 設(shè)置為null的話(huà)就不會(huì)在保存時(shí)自動(dòng)添加_class屬性.
具體javadocs看
http://static.springsource.org/spring-data/data-mongo/docs/1.0.0.RELEASE/api/org/springframework/data/mongodb/core/convert/DefaultMongoTypeMapper.html
spring的配置文件
<mongo:db-factory dbname="somedb" host="localhost" port="27017" />
<mongo:mapping-converter id="mongoConverter">
</mongo:mapping-converter>
<bean id="noClassMongoConverter" class="org.devside.mongodb.MongoConverterEnhanceFactoryBean">
<property name="converter" ref="mongoConverter" />
</bean>
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
<constructor-arg name="mongoConverter" ref="noClassMongoConverter" />
</bean>
<mongo:mapping-converter id="mongoConverter">
</mongo:mapping-converter>
<bean id="noClassMongoConverter" class="org.devside.mongodb.MongoConverterEnhanceFactoryBean">
<property name="converter" ref="mongoConverter" />
</bean>
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
<constructor-arg name="mongoConverter" ref="noClassMongoConverter" />
</bean>
這 里關(guān)鍵的類(lèi)org.devside.mongodb.MongoConverterEnhanceFactoryBean. 其實(shí)沒(méi)做什么特別的事情. 就是把spring-data的MappingMongoConverter拿過(guò)來(lái),然后把TypeMapper設(shè)置一下.
public class MongoConverterEnhanceFactoryBean implements FactoryBean<MappingMongoConverter> {
private MappingMongoConverter converter;
public void setConverter(MappingMongoConverter converter) {
this.converter = converter;
}
public MappingMongoConverter getObject() throws Exception {
MongoTypeMapper typeMapper = new DefaultMongoTypeMapper(null);
converter.setTypeMapper(typeMapper);
return converter;
}
public Class<?> getObjectType() {
return MappingMongoConverter.class;
}
public boolean isSingleton() {
return true;
}
}
private MappingMongoConverter converter;
public void setConverter(MappingMongoConverter converter) {
this.converter = converter;
}
public MappingMongoConverter getObject() throws Exception {
MongoTypeMapper typeMapper = new DefaultMongoTypeMapper(null);
converter.setTypeMapper(typeMapper);
return converter;
}
public Class<?> getObjectType() {
return MappingMongoConverter.class;
}
public boolean isSingleton() {
return true;
}
}
DefaultMongoTypeMapper類(lèi)的構(gòu)造函數(shù)的第一個(gè)參數(shù)是Type在MongoDB中名字. 設(shè)置為null的話(huà)就不會(huì)在保存時(shí)自動(dòng)添加_class屬性.
具體javadocs看
http://static.springsource.org/spring-data/data-mongo/docs/1.0.0.RELEASE/api/org/springframework/data/mongodb/core/convert/DefaultMongoTypeMapper.html