【发布时间】:2014-07-25 21:54:42
【问题描述】:
我正在使用 Spring Data 和 MongoDB 在工具包中存储非常动态的配置数据。这些Config 对象由几个组织字段以及Object 类型的data 字段组成。在Config 的某些实例上,data 对象指的是嵌套更深的子文档(例如数据库中的"data.foo.bar"。- 此字段名称由下面的getDataField() 设置)。这些Config 对象在发送到数据库时会被操作,因此存储代码如下所示:
MongoTemplate template; // This is autowired into the class.
Query query; // This is the same query which (successfully) finds the object.
Config myConfig; // The config to create or update in Mongo
Update update = new Update()
.set(getDataField(), myConfig.getData())
.set(UPDATE_TIME_FIELD, new Date())
.setOnInsert(CREATE_TIME_FIELD, new Date())
.setOnInsert(NAME_FIELD, myConfig.getName());
template.upsert(query, update, Config.class);
Spring 递归地将data 对象正确地转换为DBObject,但是数据文档及其任何子文档在数据库中都没有"_class" 字段。因此,它们无法正确反序列化。
这些问题似乎与之前在 DATAMONGO-392、DATAMONGO-407 和 DATAMONGO-724 中报告的问题非常相似。但是,这些都已修复。 (我使用的是spring-data-mongodb 1.4.2.RELEASE)
我做错了吗?有没有可能这是 Spring 问题?
【问题讨论】:
-
如果您描述实际出了什么问题,这将非常有帮助。 “没有正确反序列化”是什么意思?
-
因为数据字段没有“_class”字段,并且映射到一个Object类型的java字段,所以映射器无法推断出数据对象最初是从什么类型反序列化的。它默认为 Map
,显然不能用作原始类型。我实际上找到了一种解决方法(在将数据字段设置为 upsert 之前将其转换为 DBObject),所以这对我来说不再是超级关键。如果您担心这可能是一个合法的 Spring 问题,我很乐意继续提供信息。感谢您的回复!
标签: spring-data spring-data-mongodb