調(diào)用mongoTemplate的save方法時(shí), spring-data-mongodb的TypeConverter會(huì)自動(dòng)給document添加一個(gè)_class屬性, 值是你保存的類名. 這種設(shè)計(jì)并沒有什么壞處. spring-data-mongodb是為了在把document轉(zhuǎn)換成Java對(duì)象時(shí)能夠轉(zhuǎn)換到具體的子類. 但有時(shí)候我們并不希望出現(xiàn)這個(gè)字段, 主要是看上去會(huì)比較"煩". 可以通過設(shè)置MappingMongoConverter的MongoTypeMapper來解決這個(gè)問題.
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>
這里關(guān)鍵的類org.devside.mongodb.MongoConverterEnhanceFactoryBean. 其實(shí)沒做什么特別的事情. 就是把spring-data的MappingMongoConverter拿過來,然后把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;
????}
}
DefaultMongoTypeMapper類的構(gòu)造函數(shù)的第一個(gè)參數(shù)是Type在MongoDB中名字. 設(shè)置為null的話就不會(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