【问题标题】:Spring Data MongoDB template converts to wrong classSpring Data MongoDB 模板转换为错误的类
【发布时间】:2018-05-16 14:33:15
【问题描述】:

使用 Spring 5.0.6 和 Spring-Data-Mongo 2.0.7,我在获取被转换为错误类的实体时遇到问题。请参阅以下简化方案:

实体设置:

public class PersistableObject {
  @Id @Field("_id") private String id; 
}

@Document(collection = "myapp_user")
public class User extends PersistableObject {...}

public class RealUser extends User {...}

public class VirtualUser extends User {...}

因此,有一个通用的 MongoDB collection 存储两种类型的 User,由自动添加的 _class 属性区分。

此外,还有一个用于注入 MongoTemplate 的存储库。

@Autowired 
private org.springframework.data.mongodb.core.MongoTemplate template;

到目前为止一切都很好。现在,如果我想获取所有包含RealUser 的文档,我可以调用它

template.findAll(RealUser.class)

我希望模板能够找到所有将鉴别器属性 _class 设置为 com.myapp.domain.RealUser 的文档。

但这并没有按预期工作。我什至还得到了所有VirtualUsers,放入RealUser 类型的对象中,缺少所有特定于VirtualUser 的属性,并且所有特定于RealUser 的属性都设置为null

此外,当我去保存一个User,它实际上是MongoDB中的一个VirtualUser,但已经被压缩到一个RealUser类中,Spring会将_class属性更改为错误的类型, 神奇地VirtualUser 转换为RealUser

所以这里的两个方法都会加载整个集合并将所有对象压缩到指定的类中,即使它是错误的:

 template.findAll(VirtualUser.class)
 template.findAll(RealUser.class)

这种行为可能是不受欢迎的,或者如果是这样,那么它会极具误导性和有害性。您可以使用它轻松粉碎您的全部数据。

任何人都可以对此有所了解吗?

【问题讨论】:

    标签: java spring mongodb spring-data-mongodb


    【解决方案1】:

    我在 Spring 的 Jira 创建了一个 ticket。在下面找到 Olivers 的评论:

    该方法实际上按预期工作,但我同意我们需要 改进 JavaDoc。该方法基本上指定为“加载 文档给定类型被配置为持久化并映射所有 它们(因此名称)到给定的类型”。给定的类型不是 同时用作类型映射标准。每一个限制 您要申请退回的文件需要申请 通过一个 Query 实例,该实例公开了一个 ....restrict(...) 方法,该方法 只允许选择带有类型信息的文档。

    findAll 以它的方式工作的原因通常是 说 - 即没有适当的继承场景 - 我们需要 能够阅读所有文件,即使它们不携带任何类型 信息。假设一个包含代表人的文档的集合 尚未使用 Spring Data 编写的。如果一个 findAll(Person.class) 应用类型限制,调用将返回 即使有文件,也没有文件。不幸的是我们 不知道要查询的集合是否带有type 信息。事实上,有些文件可能带有类型信息, 有些可能不会。合理控制这一点的唯一方法是让 用户决定,她可以通过调用 Query.restrict(...) 或不调用。 前者只选择带有类型信息的文档,后者。

    正如我所说,我完全看到 JavaDoc 在这里可能会产生误导。 我会用这张票来改进它。很想听听如果 Query.restict(…) 的使用可以让你实现你想要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-09
      • 1970-01-01
      • 2015-12-17
      • 1970-01-01
      • 2020-10-14
      • 1970-01-01
      • 2014-07-22
      相关资源
      最近更新 更多