MongoTemplate将一个名为“_class”的属性插入到放入Mongo的任何内容中,并且有办法将其关闭。
然而,它似乎不愿意从它中读出任何没有_class属性的东西。简单地从mongo文档中删除它似乎使其无法访问。因为阅读你自己没有写的数据是一个明显的用例,我想我必须在这里遗漏一些东西。
我一直试图用这个:
List<SomeClass> list = mongoTemplate.findAll(SomeClass.class, "someCollection");
... SomeClass用@Id和@Document注释,someCollection中的文档否则正确映射到对象。我可以通过在代码中创建其中一个对象来验证这一点,使用insert将其导入Mongo,然后看到我可以再次读取它。
如果_class存在,这可以正常工作但如果不存在则失败。我不关心多态或任何可能实际需要此属性的东西。如何让MongoTemplate读取它本身不写的数据?
答案 0 :(得分:2)
好的,我找到了答案...... DavidA的建议是正确的,但缺少关键部分:当你使用null类型映射业务设置MappingMongoConverter事务时,它不仅停止编写&#34; _class&#34;污染,但也停止尝试阅读它。这会导致它回退到您尝试从Mongo检索文档时提供的类型。
我还没有看到任何人真正提到过这一点。 :)
所以,对于遇到这个问题的其他人来说,这里是我使用的XML配置(改编自我在StackOverflow上的其他地方找到的东西,但是我丢失了链接,抱歉):
<mongo:db-factory id="mongoDbFactory" host="${mongo.host}" port="${mongo.port}" dbname="${mongo.dbname}"/>
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
<constructor-arg name="mongoConverter" ref="mongoConverter" />
<property name="writeResultChecking" value="EXCEPTION" />
</bean>
<bean id="mongoTypeMapper" class="org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper">
<constructor-arg name="typeKey"><null/></constructor-arg>
</bean>
<bean id="mongoMappingContext" class="org.springframework.data.mongodb.core.mapping.MongoMappingContext" />
<bean id="mongoConverter" class="org.springframework.data.mongodb.core.convert.MappingMongoConverter">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
<constructor-arg name="mappingContext" ref="mongoMappingContext" />
<property name="typeMapper" ref="mongoTypeMapper"></property>
</bean>
然后在Java代码中:
//build query object
UnifiedProduct mpp = mongoTemplate.findOne(query, UnifiedProduct.class, "collection-name");
...这导致我想要的UnifiedProduct类,并且没有烦人的&#34; _class&#34;污染。
答案 1 :(得分:0)
Spring MappingMongoConverter
使用MongoTypeMapper
来确定从数据库读取DBObject时要使用的类型。 DefaultMongoTypeMapper
使用"_class"
属性按照您的描述工作。
您应该能够实现自己的MongoTypeMapper
并告诉MappingMongoConberter
使用它。您的版本可以使用其他指标而不是"_class"
值来确定阅读时应创建的类型。