調用mongoTemplate的save方法時, spring-data-mongodb的TypeConverter會自動給document添加一個_class屬性, 值是你保存的類名. 這種設計并沒有什么壞處. spring-data-mongodb是為了在把document轉換成Java對象時能夠轉換到具體的子類. 但有時候我們并不希望出現這個字段, 主要是看上去會比較"煩". 可以通過設置MappingMongoConverter的MongoTypeMapper來解決這個問題.
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>
這 里關鍵的類org.devside.mongodb.MongoConverterEnhanceFactoryBean. 其實沒做什么特別的事情. 就是把spring-data的MappingMongoConverter拿過來,然后把TypeMapper設置一下.
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類的構造函數的第一個參數是Type在MongoDB中名字. 設置為null的話就不會在保存時自動添加_class屬性.
具體javadocs看
http://static.springsource.org/spring-data/data-mongo/docs/1.0.0.RELEASE/api/org/springframework/data/mongodb/core/convert/DefaultMongoTypeMapper.html
posted on 2012-03-29 15:20
SIMONE 閱讀(702)
評論(0) 編輯 收藏 所屬分類:
JAVA