【发布时间】: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