【问题标题】:Spring Data partial upsert not persisiting type informationSpring Data部分更新不保留类型信息
【发布时间】: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-392DATAMONGO-407 和 DATAMONGO-724 中报告的问题非常相似。但是,这些都已修复。 (我使用的是spring-data-mongodb 1.4.2.RELEASE)

我做错了吗?有没有可能这是 Spring 问题?

【问题讨论】:

  • 如果您描述实际出了什么问题,这将非常有帮助。 “没有正确反序列化”是什么意思?
  • 因为数据字段没有“_class”字段,并且映射到一个Object类型的java字段,所以映射器无法推断出数据对象最初是从什么类型反序列化的。它默认为 Map,显然不能用作原始类型。我实际上找到了一种解决方法(在将数据字段设置为 upsert 之前将其转换为 DBObject),所以这对我来说不再是超级关键。如果您担心这可能是一个合法的 Spring 问题,我很乐意继续提供信息。感谢您的回复!

标签: spring-data spring-data-mongodb


【解决方案1】:

遇到了类似的问题。一种解决方案是为 Config.class 编写自己的转换器。

【讨论】:

    猜你喜欢
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    • 2022-10-20
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    相关资源
    最近更新 更多