java - 使用 Spring Data 和 MongoDB 解析子文档类型

标签 java mongodb spring-data spring-data-mongodb

我在 Spring Data 存储库尝试解析属性表达式时遇到错误:

public interface ContractRepository
    extends MongoRepository<Contract,String> {
    public List<Contract> findByCodeBindings(String binding);
}

这里是Contract的相关部分:

@Document(collection="CONTRACTS")
public class PersistentContract extends BaseContract {
    @PersistenceConstructor
    public PersistentContract(String name, Version version, Code code) {
        super(name, version, code);
    }
}

Code 是由CodeImpl 实现的接口(interface)。它包含一个属性 bindings,在 Code 中有一个 getter 和 setter。因此,查询的属性表达式旨在查找那些具有包含给定绑定(bind)的嵌套代码文档的契约(Contract)。到目前为止,还不错。

但是,问题是正在抛出 IllegalArgumentException:

java.lang.IllegalArgumentException: No property bindings found on my.company.Code!
 org.springframework.data.mapping.context.AbstractMappingContext.getPersistentPropertyPath(AbstractMappingContext.java:225)

调试该部分代码表明 Spring Data 正在分离表达式并确定存在 Code 类型的属性。但是,因为 Code 是一个接口(interface),所以它没有列出任何属性。

是否有办法向 Spring Data 提示 Code 具有此属性,或者 CodeImplcode 属性的实际类型?我很惊讶该库没有尝试解析接口(interface)的 getter 或 setter。

这是使用 spring-data-commons 1.5.1.RELEASE 和 spring-data-mongodb 1.2.1.RELEASE。

感谢帮助。

最佳答案

我的解决方案是在持久对象中完全避免接口(interface)。所以 BaseContract 变成了下面这样:

public abstract class BaseContract<T extends Code> {
    public abstract T getCode();
}

PersistentContract 是根据具体类实现的:

public class PersistentContract extends BaseContract<CodeImpl> {
}

这似乎在针对基类中的接口(interface)进行编码和满足 Spring Data 对具体类的需求之间取得了正确的平衡。

关于java - 使用 Spring Data 和 MongoDB 解析子文档类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16241901/

相关文章:

node.js - 在 Nodejs 应用程序中集成 Google Login API

php - 是否可以在没有关系数据库的情况下使用 Symfony2/Doctrine 表单验证?

java - Redis - 如何配置自定义转换

java - Apache wicket - DropDownChioce.onSelectionChanged() 不起作用

java - 安装自己的eclipse插件后没有反应

java - 如何使用 LWJGL 和 Slick2D 将图像添加到已绘制的框

c# - 选择不同的MongoDB C#

Spring Data Rest - 按多个属性排序

java - 在不重启服务器的情况下动态重新加载 Spring Mongo 数据库连接

java - println 被打印两次 - Java