如何让Spring Data读取Mongo中没有_class属性的文档

时间:2014-05-13 19:29:06

标签: spring mongodb spring-data-mongodb

MongoTemplate将一个名为“_class”的属性插入到放入Mongo的任何内容中,并且有办法将其关闭。

然而,它似乎不愿意从它中读出任何没有_class属性的东西。简单地从mongo文档中删除它似乎使其无法访问。因为阅读你自己没有写的数据是一个明显的用例,我想我必须在这里遗漏一些东西。

我一直试图用这个:

List<SomeClass> list = mongoTemplate.findAll(SomeClass.class, "someCollection");

... SomeClass用@Id和@Document注释,someCollection中的文档否则正确映射到对象。我可以通过在代码中创建其中一个对象来验证这一点,使用insert将其导入Mongo,然后看到我可以再次读取它。

如果_class存在,这可以正常工作但如果不存在则失败。我不关心多态或任何可能实际需要此属性的东西。如何让MongoTemplate读取它本身不写的数据?

2 个答案:

答案 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"值来确定阅读时应创建的类型。