デフォルトでは、SpringDataの `MappingMongoConverter`は、MongoDBに保存されたすべてのオブジェクトに対して余分な”
__class
“カラムを追加します。例えば、
public class User { String username; String password; //...getters and setters }
それを保存
MongoOperations mongoOperation = (MongoOperations)ctx.getBean("mongoTemplate"); User user = new User("mkyong", "password123"); mongoOperation.save(user, "users");
結果
> db.users.find() { "__class" : "com.mkyong.user.User", "__id" : ObjectId("5050aef830041f24ff2bd16e"), "password" : "new password", "username" : "mkyong" }
SpringDataはhttp://stackoverflow.com/questions/6810488/spring-data-mongodb-mappingmongoconverter-remove-class/[reason]のためにこの追加の「
__class
」を作成しました。
この余分な ”
__class
“を削除するには、
MappingMongoConverter`をオーバーライドし、
new DefaultMongoTypeMapper(null) `を渡します。
ここでは、アノテーションまたはXML形式で__classを削除する方法を示します。
1.注釈
@Configuration public class SpringMongoConfig{ public @Bean MongoDbFactory mongoDbFactory() throws Exception { return new SimpleMongoDbFactory(new Mongo(), "database"); } public @Bean MongoTemplate mongoTemplate() throws Exception { //remove __class MappingMongoConverter converter = new MappingMongoConverter(mongoDbFactory(), new MongoMappingContext()); converter.setTypeMapper(new DefaultMongoTypeMapper(null)); MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory(), converter); return mongoTemplate; } }
2. XML
同じことですが、XMLファイルにあります。
<mongo:mongo host="localhost" port="27017"/> <mongo:db-factory dbname="database"/> <bean id="mappingContext" class="org.springframework.data.mongodb.core.mapping.MongoMappingContext"/> <bean id="defaultMongoTypeMapper" class="org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper"> <constructor-arg name="typeKey"><null/></constructor-arg> </bean> <bean id="mappingMongoConverter" class="org.springframework.data.mongodb.core.convert.MappingMongoConverter"> <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/> <constructor-arg name="mappingContext" ref="mappingContext"/> <property name="typeMapper" ref="defaultMongoTypeMapper"/> </bean> <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/> <constructor-arg name="mongoConverter" ref="mappingMongoConverter"/> </bean>
3.もう一度試す
もう一度保存してください。 “__class”はなくなりました。
> db.users.find() { "__id" : ObjectId("random code"), "password" : "new password", "username" : "mkyong" }
参考文献
フォーラム – MappingMongoConverter remove __class]